<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4092105836392232093</id><updated>2026-11-01T11:04:25.240+09:00</updated><category term="Linux"/><category term="Debian GNU/Linux"/><category term="数学"/><category term="Debian buster"/><category term="Canvas"/><category term="情報処理"/><category term="HTML5"/><category term="LibreOffice Calc"/><category term="情報科学"/><category term="JavaScript"/><category term="プログラミング"/><category term="Debian Lenny"/><category term="LibreOffice Basic"/><category term="R言語"/><category term="C言語"/><category term="Debian trixie"/><category term="MariaDB"/><category term="Maxima"/><category term="Pascal"/><category term="Python"/><category term="Python3"/><category term="入力メソッド"/><category term="CSS"/><category term="GNU Octave"/><category term="Julia"/><category term="MySQL"/><category term="Opera"/><category term="PHP"/><category term="Ruby"/><category term="行列"/><category term="Java"/><category term="LaTeX"/><category term="LibreOffice"/><category term="LibreOffice Base"/><category term="Lighttpd"/><category term="Perl"/><category term="TeX"/><category term="Visual Studio Code"/><category term="Windows 10"/><category term="セキュリティ"/><category term="C++"/><category term="Geany"/><category term="Google"/><category term="HTML"/><category term="blogger"/><category term="エスペラント語"/><category term="サーバ管理"/><category term="シェル"/><category term="スペイン語"/><category term="データベース"/><category term="線形代数"/><category term="APT"/><category term="Ada"/><category term="C#"/><category term="CGI"/><category term="Chrome"/><category term="Docker"/><category term="Eclipse"/><category term="Free Pascal"/><category term="GTK+1.2"/><category term="Google Charts"/><category term="MetaTrader"/><category term="NLTK"/><category term="OpenOffice"/><category term="PostgreSQL"/><category term="Prolog"/><category term="Robocode"/><category term="SQL"/><category term="SQLite"/><category term="Snappy"/><category term="TensorFlow"/><category term="Unity (Game Engine)"/><category term="Unreal Engine"/><category term="Visual Studio 2019"/><category term="Wine"/><category term="aptosid"/><category term="jEdit"/><category term="vim"/><category term="xine"/><category term="アラビア語"/><category term="タイ語"/><category term="ロシア語"/><category term="機械学習"/><category term="自然言語処理"/><title type='text'>学校に通わずに学ぶログ</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>155</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-1383615310889444614</id><published>2026-02-27T10:42:00.003+09:00</published><updated>2026-02-27T10:42:45.333+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ada"/><category scheme="http://www.blogger.com/atom/ns#" term="Debian GNU/Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Debian trixie"/><category scheme="http://www.blogger.com/atom/ns#" term="Geany"/><title type='text'>Geany 2.0でAdaプログラミング中にクラッシュする症状</title><content type='html'>&lt;p&gt;Debian GNU/Linux 13 (Trixie)にインストールしたソースコード・エディタGeany 2.0を使ってプログラミング言語Adaのコードを入力していたら、特定のステートメントを入力するたびにそのGeanyが強制終了する症状に遭遇した。特定のコードというのはAdaではお決まりの次のステートメント。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;procedure Main is&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;トップメニューから「設定」-&amp;gt;「インターフェース」-&amp;gt;「インターフェース」タブで「サイドバーを表示」や「シンボルリストを表示」のチェックを外してもこの症状は解消しなかった。&lt;/p&gt;
&lt;p&gt;トップメニューから「ツール」-&amp;gt;「設定ファイル」-&amp;gt;「ファイル種類の設定」-&amp;gt;「プログラミング言語」のfiletypes.adaを開いてみた。設定のすべての項目はコメントアウトされていた。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;procedureMainis&lt;/code&gt;でも&lt;code&gt;procedure Mainis&lt;/code&gt;でも&lt;code&gt;procedureMain is&lt;/code&gt;でもクラッシュしない。&lt;code&gt;procedure Main is&lt;/code&gt;と入力された時点でその瞬間に必ずクラッシュした。タグ・パーサー（タグ解析機）の不具合が強く疑われた。&lt;/p&gt;
&lt;p&gt;けっきょくfiletypes.adaの[settings]に次のように記述してタグ・パーサーの働きを無効にすることでしか解決できなかった。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;[settings]
# procedure ... is というコードを入力するとgeanyが落ちる問題を回避
tag_parser=&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ちなみに、Debian GNU/Linux 13 (Trixie)ではfiletypes.adaファイルはホーム・ディレクトリ内の.config/geany/filedefsディレクトリ内に保存される。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/1383615310889444614/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2026/02/geany-20ada.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/1383615310889444614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/1383615310889444614'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2026/02/geany-20ada.html' title='Geany 2.0でAdaプログラミング中にクラッシュする症状'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-1196501029917080504</id><published>2025-11-02T13:18:00.001+09:00</published><updated>2026-02-27T10:43:12.149+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Debian GNU/Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Debian trixie"/><title type='text'>Debian GNU/Linux 13 trixieでスワップファイルを作ってみた</title><content type='html'>&lt;p&gt;古くて低スペックになったパソコンにDebian 13 (trixie)をインストールしてみた。けれどもその際のパーティション作成でスワップ領域を作らなかった。その代わりにスワップ・ファイルを作成することにした。&lt;/p&gt;
&lt;p&gt;インストールしたOSは次のとおり。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 13 (trixie)
Release:        13
Codename:       trixie&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;lsb_releaseはディストリビューション固有の情報を教えてくれる外部コマンド。そのオプションの-aは出力可能な全て表示することを指示している。&lt;/p&gt;
&lt;p&gt;メモリ(RAM)のサイズは次のとおり。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ cat /proc/meminfo | grep -ie memtotal -e swaptotal
MemTotal:        7810932 kB
SwapTotal:             0 kB&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;コマンドcatによって/proc/meminfoファイルを参照し、その出力内容を|（パイプ）によってコマンドgrepに渡し、memtotalとswaptotalの文字列のパターンを持つ行だけを表示させている。grepの-eはパターンを指定するオプションで、-iは大文字と小文字を区別しないように指示するオプション。&lt;/p&gt;
&lt;p&gt;16GBが最低と言われている時代に8GB弱というのはかなり低スペックのパソコン。それでもネットサーフィンをしたりSNSを利用するのには使えているし、YouTubeの動画も解像度を落として見ることができている。それでもスワップ領域がないのは心配だ。&lt;/p&gt;
&lt;h4&gt;スワップ・ファイルを作成&lt;/h4&gt;
&lt;p&gt;スワップ・ファイルを作成する際にその領域を確保するためにはddというプログラム（外部コマンド）を使う方法とfallocateというプログラム（外部コマンド）を使う方法がある。&lt;/p&gt;
&lt;p&gt;ddのほうが細かい設定ができるが、ddはfallocateよりもその処理に時間が長くかかる。ファイル・システムにBtrfsや暗号化fsを利用している場合、ddのほうが安全である利点がある。ただしHDDでなくSSDの使っている場合には必要な領域を予約するだけである理由からfallocateのほうが推奨されている。&lt;/p&gt;
&lt;p&gt;まずはfallocateを使った場合から。ハイバネートを利用しないつもりなのでRAMの大きさより若干多めに8&lt;ruby&gt;GiB&lt;rt&gt;ギビバイト&lt;/rt&gt;&lt;/ruby&gt;を確保することにした。ハイバネートを利用する場合にはRAMサイズの1.5倍から2倍のスワップ領域がおおよそ必要になる。この操作にはオペレーティング・システムの管理者権限が必要。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# fallocate -l 8GiB /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ハイバネートを利用したい場合には例えば次のように指定する。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# fallocate -l 12GiB /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ddの場合、if=で入力ファイルとして/dev/zeroという特殊なデバイス・ファイル（ゼロ・デバイス）を指定し、of=で出力ファイルとして/swapfileを指定した。bs=で一度に読み書きする情報量（ブロック・サイズ）をビット単位で\( (2^{10})^2 = 1024^2 \) = 1M(1Mibit)と指定し、count=でスワップ・ファイルの総量をbs=で指定したブロック単位で&lt;span&gt;\( 2^{10} \times 8 = 8192 \)&lt;/span&gt;と指定した。この操作にも管理者権限が必要となる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# dd if=/dev/zero of=/swapfile bs=1M count=8192&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;bs=1Mはbs=1048576と指定しても同じ。ただしbs=1MBと指定すると1048576ではなく1000000を意味する。&lt;/p&gt;
&lt;p&gt;ルート・ディレクトリ直下にスワップ・ファイルswapfileが作成されたかどうかをコマンドlsを使って確認。オプションの-lによってファイル・パーミッション（ファイルのアクセス許可）も一緒に確認することがきる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ ls -al /swapfile
-rw-rw-r-- 1 root root 16777216000 10月 17 11:28 /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rw-rw-r--の部分がパーミッション情報。左から最初のrw-（読み書き許可）が所有者のアクセス権限、次のrw-（読み書き許可）がグループのアクセス権限、最後のr--（読み込み許可）がその他のユーザーのアクセス権限を意味している。&lt;/p&gt;
&lt;p&gt;この状態ではファイルの所有者であるrootのみならずrootというグループに属するユーザーでも読み書きでき、その上、所有者でもなくてグループにも属していないその他のユーザーの権限でも読み込みができてしまうので安全でない。安全性を確保するためにファイル・パーミッション（許可）の設定を変更する必要があった。&lt;/p&gt;
&lt;h4&gt;ファイルのアクセス許可を変更&lt;/h4&gt;
&lt;p&gt;ファイル・パーミッションを変更するには/swapfileを対象に外部コマンドchmodを使う。この操作には管理者権限が必要。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# chmod 600 /swapfile
$ ls -al /swapfile
-rw------- 1 root root 16777216000 10月 17 11:28 /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;chmodの第一引数600はパーミッションを8進数で表したもの。&lt;/p&gt;
&lt;p&gt;ちなみにパーミッションを8進数で表すための対応表は次のとおり。&lt;/p&gt;
&lt;table&gt;
&lt;caption&gt;ファイルのパーミッションと8進数の対応表&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;パーミッション&lt;/th&gt;
&lt;th&gt;8進数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;---&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;--x&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-w-&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-wx&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;r--&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;r-x&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rw-&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rwx&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;/etc/fstabを編集&lt;/h4&gt;
&lt;p&gt;次に/etc/fstabファイルを編集する。重要な設定ファイルなので編集する前にcpコマンドによってコピーを作成しておいた。編集のためにここではGNU nanoというエディタを利用した。管理者権限でfeatherpadを利用してもいいと思う。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# cp /etc/fstab /etc/fstab.bak
# nano /etc/fstab&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ここでやったのは/etc/fstabファイルの最終行に次の行を追加すること。#が行頭にある行はコメント行であることを意味している。2行目の各項目の間がタブキーで区切ってあることに注意。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;# Swap file created on DATE
/swapfile       none    swap    sw      0       0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;エディタGnu nanoの操作はキーボードの[Ctrl]キーと何らかの文字キーを組み合わせて行う。GNU nanoを起動すると画面の下のほうに^Gや^Xといったキーとそれがどんな処理を意味するかが表示される。それに基づいて操作すればいい。それ以外の操作は一般的なテキスト・エディタと同様。ちなみに^Gは[Ctrl]キーを押したまま[G]キーを押すことを意味している。&lt;/p&gt;
&lt;h4&gt;スワップ領域を準備してから有効化&lt;/h4&gt;
&lt;p&gt;最後の手順としてスワップファイルを有効にするために/swapfileを対象にして外部コマンドの/sbin/swaponを実行する。この操作にも管理者権限が必要。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# /sbin/swapon /swapfile
swapon: /swapfile: スワップヘッダの読み込みに失敗しました&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ところがここでエラーが生じた。どうやらその前に外部コマンドの/sbin/mkswapによってスワップの領域の準備する手順が必要だったようだ。この操作にも管理者権限が必要となる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# /sbin/mkswap /swapfile
スワップ空間バージョン 1 を設定します。サイズ = 15.6 GiB (16777211904 バイト)
ラベルはありません, UUID=**********************************&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再び/sbin/swaponを実行。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# /sbin/swapon /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;オプションの-aを使うと/etc/fstabファイルにswapマークとともに記述されているスワップ・デバイスの全てが対象になる。ただしnoautoと記述されているスワップ・デバイスは除く。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# /sbin/swapon -a&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;で、メモリを確認してみた。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ free
               total        used        free      shared  buff/cache   available
Mem:         7810936     4680752      451496      371720     3331768     3130184
Swap:        8388604           0     8388604&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Swap:行のtotal列がスワップ領域のメモリ・サイズ。これでうまくいったようだ。&lt;/p&gt;
&lt;h4&gt;スワップ領域を無効化&lt;/h4&gt;
&lt;p&gt;/sbin/swaponでスワップを有効にした後、/swapfileファイル作成からこれらの作業をやり直すにはスワップを無効化する必要がある。スワップを無効化するには外部コマンドの/sbin/swapoffを使う。この際にも管理者権限が必要。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# /sbin/swapoff /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;オプションの-aを指定すると/etc/fstabファイルに記述されているswapマークを付けられているスワップ・デバイスの全てが対象になる。ただしnoautoと記述されているスワップ・デバイスは除く。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# /sbin/swapoff -a&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;スワップ・ファイル/swapfileを削除するには外部コマンドrmを使って次のようにする。これにも管理者権限が必要。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# rm -f /swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ここでオプションの-fは存在しないファイルを無視するための指定。&lt;/p&gt;
&lt;h4&gt;参考にしたサイトや利用したソフトウェア&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;a href=&quot;https://wiki.debian.org/Swap&quot;&gt;Debian公式サイトのWikiのSwap領域に関するページ&lt;/a&gt;&lt;/dt&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;a href=&quot;https://nano-editor.org/&quot;&gt;GNU nanoの公式サイト&lt;/a&gt;&lt;/dt&gt;
&lt;/dl&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/1196501029917080504/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2025/11/debian-gnulinux-13-trixie.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/1196501029917080504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/1196501029917080504'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2025/11/debian-gnulinux-13-trixie.html' title='Debian GNU/Linux 13 trixieでスワップファイルを作ってみた'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-3807450493675034605</id><published>2025-08-11T03:28:00.010+09:00</published><updated>2025-08-16T13:51:26.455+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GNU Octave"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Julia"/><category scheme="http://www.blogger.com/atom/ns#" term="Python3"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><category scheme="http://www.blogger.com/atom/ns#" term="R言語"/><category scheme="http://www.blogger.com/atom/ns#" term="情報処理"/><category scheme="http://www.blogger.com/atom/ns#" term="情報科学"/><category scheme="http://www.blogger.com/atom/ns#" term="数学"/><title type='text'>n進数と基数変換</title><content type='html'>&lt;h3&gt;10進数&lt;/h3&gt;

&lt;p&gt;0から9までの数字を使い、1から9まで数えたら位を1つ上げて（桁を1つ増やして）10にする数え方が一般に行われている。こうした数え方は&lt;span class=&quot;term&quot;&gt;10&lt;ruby&gt;進法&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;しんほう&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;&lt;/span&gt;と呼ばれ、それらの数は&lt;span class=&quot;term&quot;&gt;10&lt;ruby&gt;進数&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;しんすう&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;&lt;/span&gt;と呼ばれている。この数え方は、人が自分の手の指を使って物を数えるのに適していたため、そこから生まれたと考えらている。&lt;/p&gt;

&lt;p&gt;0, 1, 2, 3, 4, 5, 6, 7, 8, 9まで数えたらその次が10となり、11, 12, ..., 19まで数えたらその次が20となり、99まで数えたらその次が100となり、999まで数えたらその次が1000となる。桁をこのように増やしてゆくことで限られた数字で無限の数を表現することができる。このような記数法は10進の&lt;span class=&quot;term&quot;&gt;&lt;ruby&gt;位取&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;くらいど&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;り&lt;/ruby&gt;&lt;ruby&gt;記数法&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;きすうほう&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;&lt;/span&gt;と呼ばれている。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
1 + 9 &amp;amp;= 10 \\
\vdots \\
19 + 1 &amp;amp;= 20 \\
\vdots \\
29 + 1 &amp;amp;= 30 \\
\vdots \\
99 + 1 &amp;amp;= 100 \\
\vdots \\
199 + 1 &amp;amp;= 200 \\
\vdots \\
999 + 1 &amp;amp;= 1000 \\
\vdots
\end{align*}
&lt;/div&gt;

&lt;p&gt;漢字で二千四百六十八という数は、一の位が8つで、十の位が6つで、百の位が4つで、千の位が2つであることを意味している。アラビア数字による位取り記数法では2468のように記され、漢字では記されていた千、百、十という各位を表す文字が記されない。しかし、例えば2468は\( 2 + 4 + 6 + 8 \)であることを意味しているわけではなく\( 2000 + 400 + 60 + 8 \)であることを意味している。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\[ 2468 \neq 2 + 4 + 6 + 8 \]
&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;
\begin{align*}
2468 &amp;amp;= 2000 + 400 + 60 + 8 \\
&amp;amp;= 2 \times 1000 + 4 \times 100 + 6 \times 10 + 8 \times 1 \\
&amp;amp;= 2 \times 10^3 + 4 \times 10^2 + 6 \times 10^1 + 8 \times 10^0
\end{align*}
&lt;/div&gt;

&lt;p&gt;\( \neq \)は等しくないという意味である。この二つ目の数式にある\( 10^3 = 1000,\ 10^2 = 100,\ 10^1 = 10,\ 10^0 = 1 \)が各桁の数字が属している&lt;ruby&gt;位&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;くらい&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;であり、それらはそれぞれ千の位、百の位、十の位、一の位または&lt;ruby&gt;桁&lt;rt&gt;けた&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。各位が持っている千、百、十、一という値を数学では&lt;span class=&quot;term&quot;&gt;&lt;ruby&gt;桁値&lt;rt&gt;&lt;rp&gt;（&lt;/rp&gt;けたち&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;&lt;/span&gt;と呼ぶが、計算機科学の世界では&lt;span class=&quot;term&quot;&gt;重み&lt;/span&gt;と呼ばれている。桁のそれぞれの数字はその桁値だけ倍にした数を表している。&lt;/p&gt;

&lt;h3&gt;2進数&lt;/h3&gt;

&lt;p&gt;電子計算機やコンピュータの内部では、電圧の高低差を利用した2進法による計算が行わている。2進法は0と1という2つの数字だけを使って表されている。2進法では、0, 1, 10, 11, 100, 101, 110, 111, 1000, ...のように桁が増えてゆく。これは2進の位取り記数法である。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
1 + 1 &amp;amp;= 10 \\
10 + 1 &amp;amp;= 11 \\
11 + 1 &amp;amp;= 100 \\
101 + 1 &amp;amp;= 110 \\
110 + 1 &amp;amp;= 111 \\
111 + 1 &amp;amp;= 1000 \\
\vdots
\end{align*}
&lt;/div&gt;

&lt;p&gt;2進法では、10は「ジュー」と読むのではなく「イチゼロ」と読む。同様に11は「ジューイチ」ではなく「イチイチ」、100は「ヒャク」ではなく「イチゼロゼロ」、111は「イチイチイチ」と電話番号のように読む。&lt;/p&gt;

&lt;p&gt;例えば、2進数の1101「イチイチゼロイチ」を多項式にして表せば、次のような数であることを意味している。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
1101 &amp;amp;= 1 \times 10^3 + 1 \times 10^2 + 0 \times 10^1 + 1 \times 10^0 \\
&amp;amp;= 1 \times 1000 + 1 \times 100 + 0 \times 10 + 1 \times 1 \\
&amp;amp;= 1000 + 10 + 0 + 1
\end{align*}
&lt;/div&gt;

&lt;p&gt;ただし、2進法での桁値である例えば1000, 100, 10は、漢字でいうところの千、百、十を意味するのではない。2進数での1000は「イチゼロゼロゼロ」、100は「イチゼロゼロ」、10は「イチゼロ」という桁値を持っていることになる。&lt;/p&gt;

&lt;p&gt;2進数の1桁は、計算機科学、情報数学、情報工学の分野ではビットという単位で呼ばれている。C言語などのプログラミング言語では1011BのようにBを添えて2進数であることを示す。Bは2進数を表す英語binary numberの頭文字bによる。&lt;/p&gt;

&lt;h3&gt;2進数を10進数への変換&lt;/h3&gt;

&lt;p&gt;桁値を理解することが10進数へと他の進数を変換するために役立つ。次の数式は2進数である1101をそれに対応する10進数へと変換している多項式である。ここでは\( = \)の代わりに\( \rightarrow \)という記号を使って2進数と10進数との間の対応関係を表している。下の式の計算結果から2進数の1101が10進数では13に対応していることが分かる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(1101)_2 &amp;amp; \rightarrow (1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0)_{10} \\
&amp;amp; \rightarrow (1 \times 8 + 1 \times 4 + 0 \times 2 + 1 \times 1)_{10} \\
&amp;amp; \rightarrow (1 \times 8 + 1 \times 4 + 0 + 1 \times 1)_{10} \\
&amp;amp; \rightarrow (8 + 4 + 0 + 1)_{10} \\
&amp;amp; \rightarrow (13)_{10}
\end{align*}
&lt;/div&gt;

&lt;p&gt;上の数式では、\( \rightarrow \)の左辺が2進数であり、\( \rightarrow \)の右辺が10進数である。2進数であることを\( (...)_2 \)と表し、10進数であることを\( (...)_{10} \)と表している。2進数である1101は10進数では13に対応している。2進数のそれぞれの位の重み、すなわち桁値を10進数で表すと、\( 2^3 = 8,\ 2^2 = 4,\ 2^1 = 2,\ 2^0 = 1\)になることが分かる。2進数でのそれぞれの桁が10進数ではこのような重みを持っていることを理解していれば、2進数から10進数への変換は簡単な算術でたやすく行える。&lt;/p&gt;

&lt;h3&gt;2進数と10進数の対応表&lt;/h3&gt;

&lt;p&gt;次の表は2進数と10進数の対応関係を示している。この表から2進数の1101が10進数の13に対応することが見て取れる。&lt;/p&gt;

&lt;table&gt;
 &lt;caption&gt;2進数と10進数の対応関係&lt;/caption&gt;
 &lt;tr&gt;
  &lt;th&gt;2進数&lt;/th&gt;
  &lt;th&gt;10進数&lt;/th&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10&lt;/td&gt;
  &lt;td&gt;2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11&lt;/td&gt;
  &lt;td&gt;3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100&lt;/td&gt;
  &lt;td&gt;4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;101&lt;/td&gt;
  &lt;td&gt;5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;110&lt;/td&gt;
  &lt;td&gt;6&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;111&lt;/td&gt;
  &lt;td&gt;7&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000&lt;/td&gt;
  &lt;td&gt;8&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1001&lt;/td&gt;
  &lt;td&gt;9&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1010&lt;/td&gt;
  &lt;td&gt;10&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1011&lt;/td&gt;
  &lt;td&gt;11&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1100&lt;/td&gt;
  &lt;td&gt;12&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1101&lt;/td&gt;
  &lt;td&gt;13&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1110&lt;/td&gt;
  &lt;td&gt;14&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1111&lt;/td&gt;
  &lt;td&gt;15&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10000&lt;/td&gt;
  &lt;td&gt;16&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10001&lt;/td&gt;
  &lt;td&gt;17&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10010&lt;/td&gt;
  &lt;td&gt;18&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10011&lt;/td&gt;
  &lt;td&gt;19&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10100&lt;/td&gt;
  &lt;td&gt;20&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10101&lt;/td&gt;
  &lt;td&gt;21&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10110&lt;/td&gt;
  &lt;td&gt;22&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10111&lt;/td&gt;
  &lt;td&gt;23&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11000&lt;/td&gt;
  &lt;td&gt;24&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11001&lt;/td&gt;
  &lt;td&gt;25&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11010&lt;/td&gt;
  &lt;td&gt;26&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11011&lt;/td&gt;
  &lt;td&gt;27&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11100&lt;/td&gt;
  &lt;td&gt;28&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11101&lt;/td&gt;
  &lt;td&gt;29&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11110&lt;/td&gt;
  &lt;td&gt;30&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11111&lt;/td&gt;
  &lt;td&gt;31&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100000&lt;/td&gt;
  &lt;td&gt;32&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100001&lt;/td&gt;
  &lt;td&gt;33&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100010&lt;/td&gt;
  &lt;td&gt;34&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100011&lt;/td&gt;
  &lt;td&gt;35&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100100&lt;/td&gt;
  &lt;td&gt;36&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100101&lt;/td&gt;
  &lt;td&gt;37&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100110&lt;/td&gt;
  &lt;td&gt;38&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100111&lt;/td&gt;
  &lt;td&gt;39&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;101000&lt;/td&gt;
  &lt;td&gt;40&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;101001&lt;/td&gt;
  &lt;td&gt;41&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;101010&lt;/td&gt;
  &lt;td&gt;42&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;101011&lt;/td&gt;
  &lt;td&gt;43&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;101100&lt;/td&gt;
  &lt;td&gt;44&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;101101&lt;/td&gt;
  &lt;td&gt;45&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;101110&lt;/td&gt;
  &lt;td&gt;46&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;101111&lt;/td&gt;
  &lt;td&gt;47&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;110000&lt;/td&gt;
  &lt;td&gt;48&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;110001&lt;/td&gt;
  &lt;td&gt;49&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;110010&lt;/td&gt;
  &lt;td&gt;50&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;110011&lt;/td&gt;
  &lt;td&gt;51&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;110100&lt;/td&gt;
  &lt;td&gt;52&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;110101&lt;/td&gt;
  &lt;td&gt;53&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;110110&lt;/td&gt;
  &lt;td&gt;54&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;110111&lt;/td&gt;
  &lt;td&gt;55&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;111000&lt;/td&gt;
  &lt;td&gt;56&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;111001&lt;/td&gt;
  &lt;td&gt;57&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;111010&lt;/td&gt;
  &lt;td&gt;58&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;111011&lt;/td&gt;
  &lt;td&gt;59&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;111100&lt;/td&gt;
  &lt;td&gt;60&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;111101&lt;/td&gt;
  &lt;td&gt;61&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;111110&lt;/td&gt;
  &lt;td&gt;62&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;111111&lt;/td&gt;
  &lt;td&gt;63&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000000&lt;/td&gt;
  &lt;td&gt;64&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000001&lt;/td&gt;
  &lt;td&gt;65&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000010&lt;/td&gt;
  &lt;td&gt;66&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000011&lt;/td&gt;
  &lt;td&gt;67&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000100&lt;/td&gt;
  &lt;td&gt;68&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000101&lt;/td&gt;
  &lt;td&gt;69&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000110&lt;/td&gt;
  &lt;td&gt;70&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000111&lt;/td&gt;
  &lt;td&gt;71&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1001000&lt;/td&gt;
  &lt;td&gt;72&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1001001&lt;/td&gt;
  &lt;td&gt;73&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1001010&lt;/td&gt;
  &lt;td&gt;74&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1001011&lt;/td&gt;
  &lt;td&gt;75&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1001100&lt;/td&gt;
  &lt;td&gt;76&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1001101&lt;/td&gt;
  &lt;td&gt;77&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1001110&lt;/td&gt;
  &lt;td&gt;78&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1001111&lt;/td&gt;
  &lt;td&gt;79&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1010000&lt;/td&gt;
  &lt;td&gt;80&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1010001&lt;/td&gt;
  &lt;td&gt;81&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1010010&lt;/td&gt;
  &lt;td&gt;82&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1010011&lt;/td&gt;
  &lt;td&gt;83&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1010100&lt;/td&gt;
  &lt;td&gt;84&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1010101&lt;/td&gt;
  &lt;td&gt;85&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1010110&lt;/td&gt;
  &lt;td&gt;86&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1010111&lt;/td&gt;
  &lt;td&gt;87&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1011000&lt;/td&gt;
  &lt;td&gt;88&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1011001&lt;/td&gt;
  &lt;td&gt;89&lt;/td&gt;
 &lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;1011010&lt;/td&gt;
  &lt;td&gt;90&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1011011&lt;/td&gt;
  &lt;td&gt;91&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1011100&lt;/td&gt;
  &lt;td&gt;92&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1011101&lt;/td&gt;
  &lt;td&gt;93&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1011110&lt;/td&gt;
  &lt;td&gt;94&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1011111&lt;/td&gt;
  &lt;td&gt;95&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1100000&lt;/td&gt;
  &lt;td&gt;96&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1100001&lt;/td&gt;
  &lt;td&gt;97&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1100010&lt;/td&gt;
  &lt;td&gt;98&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1100011&lt;/td&gt;
  &lt;td&gt;99&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1100100&lt;/td&gt;
  &lt;td&gt;100&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1100101&lt;/td&gt;
  &lt;td&gt;101&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1100110&lt;/td&gt;
  &lt;td&gt;102&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1100111&lt;/td&gt;
  &lt;td&gt;103&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1101000&lt;/td&gt;
  &lt;td&gt;104&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1101001&lt;/td&gt;
  &lt;td&gt;105&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1101010&lt;/td&gt;
  &lt;td&gt;106&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1101011&lt;/td&gt;
  &lt;td&gt;107&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1101100&lt;/td&gt;
  &lt;td&gt;108&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1101101&lt;/td&gt;
  &lt;td&gt;109&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1101110&lt;/td&gt;
  &lt;td&gt;110&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1101111&lt;/td&gt;
  &lt;td&gt;111&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1110000&lt;/td&gt;
  &lt;td&gt;112&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1110001&lt;/td&gt;
  &lt;td&gt;113&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1110010&lt;/td&gt;
  &lt;td&gt;114&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1110011&lt;/td&gt;
  &lt;td&gt;115&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1110100&lt;/td&gt;
  &lt;td&gt;116&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1110101&lt;/td&gt;
  &lt;td&gt;117&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1110110&lt;/td&gt;
  &lt;td&gt;118&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1110111&lt;/td&gt;
  &lt;td&gt;119&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1111000&lt;/td&gt;
  &lt;td&gt;120&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1111001&lt;/td&gt;
  &lt;td&gt;121&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1111010&lt;/td&gt;
  &lt;td&gt;122&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1111011&lt;/td&gt;
  &lt;td&gt;123&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1111100&lt;/td&gt;
  &lt;td&gt;124&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1111101&lt;/td&gt;
  &lt;td&gt;125&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1111110&lt;/td&gt;
  &lt;td&gt;126&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1111111&lt;/td&gt;
  &lt;td&gt;127&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10000000&lt;/td&gt;
  &lt;td&gt;128&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;上の表においてもう一つ注目すべき点は、この表から2進数の桁値を10進数で表したときの値が見て取れることである。2進数の1が10進数では1、2進数の10が10進数では2、2進数の100が10進数では4、2進数の1000が10進数では8になっている。2進数で桁が増えているところでの10進数の値を見れば、2進数のそれぞれの位を10進数で表した場合の桁値が判断できる。その対応関係は次の表の通りになる。&lt;/p&gt;

&lt;table&gt;
&lt;caption&gt;2進数の位を10進数での桁値で表すと&lt;/caption&gt;
 &lt;tr&gt;
  &lt;th&gt;2進数&lt;/th&gt;
  &lt;th&gt;10進数&lt;/th&gt;
  &lt;th&gt;10進冪乗&lt;/th&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;\( 2^0 \)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10&lt;/td&gt;
  &lt;td&gt;2&lt;/td&gt;
  &lt;td&gt;\( 2^1 \)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100&lt;/td&gt;
  &lt;td&gt;4&lt;/td&gt;
  &lt;td&gt;\( 2^2 \)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000&lt;/td&gt;
  &lt;td&gt;8&lt;/td&gt;
  &lt;td&gt;\( 2^3 \)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10000&lt;/td&gt;
  &lt;td&gt;16&lt;/td&gt;
  &lt;td&gt;\( 2^4 \)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100000&lt;/td&gt;
  &lt;td&gt;32&lt;/td&gt;
  &lt;td&gt;\( 2^5 \)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000000&lt;/td&gt;
  &lt;td&gt;64&lt;/td&gt;
  &lt;td&gt;\( 2^6 \)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10000000&lt;/td&gt;
  &lt;td&gt;128&lt;/td&gt;
  &lt;td&gt;\( 2^7 \)&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;2進数で位が増えたところの10進数での値を見ると、2進数の各位の重み（桁値）を10進数で表した値が直前の数の2倍ずつ増えていることが、この表から見て取れる。これは&lt;ruby&gt;初項&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;しょこう&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;が1、&lt;ruby&gt;公比&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;こうひ&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;が2の等比数列である。初項は最初の数、公比の2はこの数列が常に2倍ずつ増えていることによる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\[ \begin{array}{c}
&amp;amp; 1 &amp;amp; 2 &amp;amp; 4 &amp;amp; 8 &amp;amp; 16 &amp;amp; 32 &amp;amp; 64 &amp;amp; 128 &amp;amp; ... \\
&amp;amp; 2^0 &amp;amp; 2^1 &amp;amp; 2^2 &amp;amp; 2^3 &amp;amp; 2^4 &amp;amp; 2^5 &amp;amp; 2^6 &amp;amp; 2^7 &amp;amp; ...
\end{array} \]
&lt;/div&gt;

&lt;p&gt;&lt;ruby&gt;冪乗&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;べきじょう&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;で表したとき、全ての桁値に共通する2の数字は&lt;span class=&quot;term&quot;&gt;&lt;ruby&gt;基底&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;きてい&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;&lt;/span&gt;または単に&lt;span class=&quot;term&quot;&gt;&lt;ruby&gt;底&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;そこ&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;&lt;/span&gt;と呼ばれている。計算機科学ではこれを&lt;span class=&quot;term&quot;&gt;&lt;ruby&gt;基数&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;きすう&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;&lt;/span&gt;と呼ぶことが多いが、数学でいう集合数のことではない。英語ではbaseまたはradix。2進数の2はここから来ている。10進数は10を基底とする進法である。さらに、等比数列の特徴として、基数の右上の&lt;ruby&gt;指数&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;しすう&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;が0から順に0, 1, 2, 3, 4, 5, ...と増えていることがこの表から見て取れる。&lt;/p&gt;

&lt;p&gt;ちなみに、\( a = b^i \)と表されるとき、指数の形で表されているこのiの値はbを基底とするaの値の&lt;ruby&gt;対数&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;たいすう&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;とも呼ばれている。例えば\( 2^7 \)の指数7は2を基底とする128の対数と呼び、\( 2^5 \)の指数5は2を基底とする32の対数と呼ぶ。それぞれ次のように書く。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\[ \log_2 128 = 7,\ \log_2 32 = 5 \]
&lt;/div&gt;

&lt;h3&gt;冪乗に関するちょっとした注意&lt;/h3&gt;

&lt;p&gt;&lt;ruby&gt;&lt;rb&gt;冪乗&lt;/rb&gt;&lt;rt&gt;べきじょう&lt;/rt&gt;&lt;/ruby&gt;は&lt;ruby&gt;基底部&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;きていぶ&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;と&lt;ruby&gt;指数部&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;しすうぶ&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;から成っている。基底部の数を\( r \)としたとき、冪乗とは次のような演算を簡略に表記したものである。ちなみにrは基数を意味するradixの頭文字。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
r^2 &amp;amp;= r \times r \\
r^4 &amp;amp;= r \times r \times r \times r
\end{align*}
&lt;/div&gt;

&lt;p&gt;ただし、\( r \)の0乗と\( r \)の1乗はそれぞれ次のようになることに注意が必要である。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
r^0 &amp;amp;= 1 \\
r^1 &amp;amp;= r
\end{align*}
&lt;/div&gt;

&lt;p&gt;なぜなら、冪乗は厳密には次のような演算を意味するからである。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
r^0 &amp;amp;= 1 \\
r^1 &amp;amp;= 1 \times r = r \\
r^2 &amp;amp;= 1 \times r \times r \\
r^3 &amp;amp;= 1 \times r \times r \times r \\
r^4 &amp;amp;= 1 \times r \times r \times r \times r
\end{align*}
&lt;/div&gt;

&lt;p&gt;&lt;ruby&gt;&lt;rb&gt;累乗&lt;/rb&gt;&lt;rt&gt;るいじょう&lt;/rt&gt;&lt;/ruby&gt;と冪乗の違いは累乗の指数部が0を含まない自然数に限られること。冪乗には指数部が小数や分数である分数乗や指数部が円周率である無理数乗までもが含まれる。冪乗は累乗を拡張したものだと言えるのかもしれない。&lt;/p&gt;

&lt;h3&gt;8進数や12進数を10進数へと変換&lt;/h3&gt;

&lt;p&gt;例えば8進法や12進数でも同様のことが成り立つ。8進法は0から7までの数字で表す位取り記数法であり、12進法は0から9、そしてTとEまでの英数字で表す位取り記数法である。TはtenのTで10進数で10に対応し、EはelevenのEで10進数で11に対応する。&lt;/p&gt;

&lt;p&gt;2進数の場合と同様の方法で8進数や12進数を10進数へと変換することができる。ここでは\( (...)_r \)という形でr進数であることを示す。rはradixのrで、rには任意の&lt;ruby&gt;自然数&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;しぜんすう&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;が入る。ここでは例として8進数と12進数を表すので、それぞれのrに8と12が入っている。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(2308)_8 &amp;amp; \rightarrow (2 \times 8^3 + 3 \times 8^2 + 0 \times 8^1 + 8 \times 8^0)_{10} \\
&amp;amp; \rightarrow (2 \times 512 + 3 \times 64 + 0 \times 8 + 8 \times 1)_{10} \\
&amp;amp; \rightarrow (1024 + 192 + 0 + 8)_{10} \\
&amp;amp; \rightarrow (1216 + 8)_{10} \\
&amp;amp; \rightarrow (1224)_{10}
\end{align*}
&lt;/div&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(3TE)_{12} &amp;amp; \rightarrow (3 \times 12^2 + 10 \times 12^1 + 11 \times 12^0)_{10} \\
&amp;amp; \rightarrow (3 \times 144 + 10 \times 12 + 11 \times 1)_{10} \\
&amp;amp; \rightarrow (432 + 120 + 11)_{10} \\
&amp;amp; \rightarrow (552 + 11)_{10} \\
&amp;amp; \rightarrow (563)_{10} \\
\end{align*}
&lt;/div&gt;

&lt;p&gt;これらの計算のとおり、、8進数の2308を10進数に変換すると10進数の1224になり、12進数の3TEを10進数に変換すると10進数の563になることが分かる。&lt;/p&gt;

&lt;p&gt;8進数と12進数の桁値は次のような対応表になる。&lt;/p&gt;

&lt;table&gt;
&lt;caption&gt;8進数の位を10進数での桁値で表すと&lt;/caption&gt;
 &lt;tr&gt;
  &lt;th&gt;8進数&lt;/th&gt;
  &lt;th&gt;10進数&lt;/th&gt;
  &lt;th&gt;10進冪乗&lt;/th&gt;
  &lt;th&gt;10進対数&lt;/th&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;\( 8^0 \)&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10&lt;/td&gt;
  &lt;td&gt;8&lt;/td&gt;
  &lt;td&gt;\( 8^1 \)&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100&lt;/td&gt;
  &lt;td&gt;64&lt;/td&gt;
  &lt;td&gt;\( 8^2 \)&lt;/td&gt;
  &lt;td&gt;2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000&lt;/td&gt;
  &lt;td&gt;512&lt;/td&gt;
  &lt;td&gt;\( 8^3 \)&lt;/td&gt;
  &lt;td&gt;3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10000&lt;/td&gt;
  &lt;td&gt;4096&lt;/td&gt;
  &lt;td&gt;\( 8^4 \)&lt;/td&gt;
  &lt;td&gt;4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100000&lt;/td&gt;
  &lt;td&gt;32768&lt;/td&gt;
  &lt;td&gt;\( 8^5 \)&lt;/td&gt;
  &lt;td&gt;5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000000&lt;/td&gt;
  &lt;td&gt;262144&lt;/td&gt;
  &lt;td&gt;\( 8^6 \)&lt;/td&gt;
  &lt;td&gt;6&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10000000&lt;/td&gt;
  &lt;td&gt;2097152&lt;/td&gt;
  &lt;td&gt;\( 8^7 \)&lt;/td&gt;
  &lt;td&gt;7&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100000000&lt;/td&gt;
  &lt;td&gt;16777216&lt;/td&gt;
  &lt;td&gt;\( 8^8 \)&lt;/td&gt;
  &lt;td&gt;8&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;

&lt;br&gt;

&lt;table&gt;
&lt;caption&gt;12進数の位を10進数での桁値で表すと&lt;/caption&gt;
 &lt;tr&gt;
  &lt;th&gt;12進数&lt;/th&gt;
  &lt;th&gt;10進数&lt;/th&gt;
  &lt;th&gt;10進冪乗&lt;/th&gt;
  &lt;th&gt;10進対数&lt;/th&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;\( 12^0 \)&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10&lt;/td&gt;
  &lt;td&gt;12&lt;/td&gt;
  &lt;td&gt;\( 12^1 \)&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100&lt;/td&gt;
  &lt;td&gt;144&lt;/td&gt;
  &lt;td&gt;\( 12^2 \)&lt;/td&gt;
  &lt;td&gt;2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000&lt;/td&gt;
  &lt;td&gt;1728&lt;/td&gt;
  &lt;td&gt;\( 12^3 \)&lt;/td&gt;
  &lt;td&gt;3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10000&lt;/td&gt;
  &lt;td&gt;20736&lt;/td&gt;
  &lt;td&gt;\( 12^4 \)&lt;/td&gt;
  &lt;td&gt;4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100000&lt;/td&gt;
  &lt;td&gt;248832&lt;/td&gt;
  &lt;td&gt;\( 12^5 \)&lt;/td&gt;
  &lt;td&gt;5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000000&lt;/td&gt;
  &lt;td&gt;2985984&lt;/td&gt;
  &lt;td&gt;\( 12^6 \)&lt;/td&gt;
  &lt;td&gt;6&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10000000&lt;/td&gt;
  &lt;td&gt;35831808&lt;/td&gt;
  &lt;td&gt;\( 12^7 \)&lt;/td&gt;
  &lt;td&gt;7&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100000000&lt;/td&gt;
  &lt;td&gt;429981696&lt;/td&gt;
  &lt;td&gt;\( 12^8 \)&lt;/td&gt;
  &lt;td&gt;8&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;小数の場合&lt;/h3&gt;

&lt;p&gt;小数ではどうか。例えば10進数の小数0.123は次のような多項式に表すことができる。マイナスの指数を持つ冪乗は小数を表している。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
0.123 &amp;amp;= 0.1 + 0.02 + 0.003 \\
&amp;amp;= \dfrac{1}{10} + \dfrac{2}{100} + \dfrac{3}{1000} \\
&amp;amp;= 1 \times 0.1 + 2 \times 0.01 + 3 \times 0.001 \\
&amp;amp;= 1 \times \dfrac{1}{10} + 2 \times \dfrac{1}{100} + 3 \times \dfrac{1}{1000} \\
&amp;amp;= 1 \times \dfrac{1}{10} + 2 \times \dfrac{1}{10^2} + 3 \times \dfrac{1}{10^3} \\
&amp;amp;= 1 \times 10^{-1} + 2 \times 10^{-2} + 3 \times 10^{-3}
\end{align*}
&lt;/div&gt;

&lt;p&gt;10進数の整数＋小数の数75.29を多項式に表すと次のようになる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
75.29 &amp;amp;= 70 + 5 + 0.2 + 0.09 \\
&amp;amp;= 7 \times 10 + 5 \times 1 + 2 \times 0.1 + 9 \times 0.01 \\
&amp;amp;= 7 \times 10 + 5 \times 1 + 2 \times \dfrac{1}{10} + 9 \times \dfrac{1}{100} \\
&amp;amp;= 7 \times 10 + 5 \times 1 + 2 \times \dfrac{1}{10^1} + 9 \times \dfrac{1}{10^2} \\
&amp;amp;= 7 \times 10^1 + 5 \times 10^0 + 2 \times 10^{-1} + 9 \times 10^{-2}
\end{align*}
&lt;/div&gt;

&lt;p&gt;したがって、2進数の小数0.101を10進数に変換するには次のように計算すればよい。2進数の各桁値を10進数の冪乗で表したとき、基底の数（基数）は10ではなく2になる。この計算結果から、2進数の0.101は10進数では0.625だと分かる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(0.101)_2 &amp;amp; \rightarrow (1 \times 2^{-1} + 0 \times 2^{-2} + 1 \times 2^{-3})_{10} \\
&amp;amp; \rightarrow \left(1 \times \dfrac{1}{2} + 0 \times \dfrac{1}{2^2} + 1 \times \dfrac{1}{2^3} \right)_{10} \\
&amp;amp; \rightarrow (1 \times 0.5 + 0 \times 0.25 + 1 \times 0.125)_{10} \\
&amp;amp; \rightarrow (0.5 + 0 + 0.125)_{10} \\
&amp;amp; \rightarrow (0.625)_{10}
\end{align*}
&lt;/div&gt;

&lt;p&gt;2進数の小数の各桁値を表にしてみるとこうなる。&lt;/p&gt;

&lt;table&gt;
&lt;caption&gt;2進小数の各位の10進数での桁値&lt;/caption&gt;
 &lt;tr&gt;
  &lt;th&gt;2進数&lt;/th&gt;
  &lt;th&gt;10進数&lt;/th&gt;
  &lt;th&gt;10進冪乗&lt;/th&gt;
  &lt;th&gt;10進分数&lt;/th&gt;
  &lt;th&gt;10進対数&lt;/th&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.1&lt;/td&gt;
  &lt;td&gt;0.5&lt;/td&gt;
  &lt;td&gt;\( 2^{-1} = 0.5^1 \)&lt;/td&gt;
  &lt;td&gt;\( \dfrac{1}{2^1} \)&lt;/td&gt;
  &lt;td&gt;-1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.01&lt;/td&gt;
  &lt;td&gt;0.25&lt;/td&gt;
  &lt;td&gt;\( 2^{-2} = 0.5^2 \)&lt;/td&gt;
  &lt;td&gt;\( \dfrac{1}{2^2} \)&lt;/td&gt;
  &lt;td&gt;-2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.001&lt;/td&gt;
  &lt;td&gt;0.125&lt;/td&gt;
  &lt;td&gt;\( 2^{-3} = 0.5^3 \)&lt;/td&gt;
  &lt;td&gt;\( \dfrac{1}{2^3} \)&lt;/td&gt;
  &lt;td&gt;-3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.0001&lt;/td&gt;
  &lt;td&gt;0.0625&lt;/td&gt;
  &lt;td&gt;\( 2^{-4} = 0.5^4 \)&lt;/td&gt;
  &lt;td&gt;\( \dfrac{1}{2^4} \)&lt;/td&gt;
  &lt;td&gt;-4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.00001&lt;/td&gt;
  &lt;td&gt;0.03125&lt;/td&gt;
  &lt;td&gt;\( 2^{-5} = 0.5^5 \)&lt;/td&gt;
  &lt;td&gt;\( \dfrac{1}{2^5} \)&lt;/td&gt;
  &lt;td&gt;-5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.000001&lt;/td&gt;
  &lt;td&gt;0.015625&lt;/td&gt;
  &lt;td&gt;\( 2^{-6} = 0.5^6 \)&lt;/td&gt;
  &lt;td&gt;\( \dfrac{1}{2^6} \)&lt;/td&gt;
  &lt;td&gt;-6&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.0000001&lt;/td&gt;
  &lt;td&gt;0.0078125&lt;/td&gt;
  &lt;td&gt;\( 2^{-7} = 0.5^7 \)&lt;/td&gt;
  &lt;td&gt;\( \dfrac{1}{2^7} \)&lt;/td&gt;
  &lt;td&gt;-7&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.00000001&lt;/td&gt;
  &lt;td&gt;0.00390625&lt;/td&gt;
  &lt;td&gt;\( 2^{-8} = 0.5^8 \)&lt;/td&gt;
  &lt;td&gt;\( \dfrac{1}{2^8} \)&lt;/td&gt;
  &lt;td&gt;-8&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;マイナスの指数を持つ冪乗&lt;/h3&gt;

&lt;p&gt;\( r \)のマイナス\( i \)乗は次のような意味を表している。\( = \)は左右が互いに等しいことを示す。\( r \)は基底を意味する英語radix――base of numberとも言う――のr、\( i \)は指数を意味する英語indexのi。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\[ r^{-i} = \dfrac{1}{r^i} = 1 \div r^i \]
&lt;/div&gt;

&lt;p&gt;\( i \)に具体的な数を&lt;ruby&gt;代入&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;だいにゅう&lt;/rt&gt;&lt;/ruby&gt;して表すとこうなる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
r^{-1} &amp;amp;= \dfrac{1}{r} = 1 \div r \\
r^{-2} &amp;amp;= \dfrac{1}{r^2} = 1 \div r^2 \\
r^{-3} &amp;amp;= \dfrac{1}{r^3} = 1 \div r^3 \\
r^{-4} &amp;amp;= \dfrac{1}{r^4} = 1 \div r^4 \\
r^{-5} &amp;amp;= \dfrac{1}{r^5} = 1 \div r^5 \\
r^{-6} &amp;amp;= \dfrac{1}{r^6} = 1 \div r^6 \\
r^{-7} &amp;amp;= \dfrac{1}{r^7} = 1 \div r^7 \\
&amp;amp; \hspace{2em} \vdots
\end{align*}
&lt;/div&gt;

&lt;p&gt;指数部がマイナスになっている冪乗は、1以下0以上の数、すなわち小数を表している。&lt;/p&gt;

&lt;h3&gt;r進数から10進数への変換&lt;/h3&gt;

&lt;p&gt;r進数からその数に対応する10進数への数の変換は、一般に次のようにして計算することができる。見やすくするために各位の計算を表している各項を&lt;ruby&gt;括弧&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;かっこ&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;でくくった。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
I_n \rightarrow \sum_{i=0}^{n-1} (a_i \times r^{i})
&amp;amp;= (a_0 \times r^0) + (a_1 \times r^1) + (a_2 \times r^2) + ... + (a_n \times r^{n-1})
\end{align*}
&lt;/div&gt;

&lt;p&gt;\( I_n \)のIは整数を表す英語integerの頭文字、添え字のnは桁数を表す。\( r \)とは基底を表す英語radixの&lt;ruby&gt;頭文字&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;かしらもじ&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;であり、2進数の場合は2、5進数の場合は5が入る。その添え字のnは与えられた数の桁数を表している。\( \sum \)は&lt;span class=&quot;term&quot;&gt;サメーション&lt;/span&gt;、つまり合計のことであり、ギリシア文字で&lt;span class=&quot;term&quot;&gt;シグマ&lt;/span&gt;と読む。\( a \)は与えられた数の各位にある数字、\( n \)は与えられた数の桁の数のことで、0から数えるので\( n \)から1を引いてある。\( k \)は桁値を冪乗で表したときの指数を表し、低い位から何桁目かを指している。サメーションの下の\( k=0 \)は0から始まることを表し、サメーションの上の\( n \)（任意の自然数）はその数の桁数回足し算が続くことを意味している。足し算なので&lt;ruby&gt;交換法則&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;こうかんほうそく&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;、すなわち足す順番が自由でよいという法則が成り立ち、計算の順番を逆にしても同じ値が得られる。&lt;/p&gt;

&lt;p&gt;小数の場合は次のようになる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
\sum_{j=1}^{m} (a_{-j} \times r^{-j})
&amp;amp;= (a_{-1} \times r^{-1}) + (a_{-2} \times r^{-2}) + (a_{-3} \times r^{-3}) + ... + (a_{-m} \times r^{-m}) \\
&amp;amp;= \left(a_{-1} \times \dfrac{1}{r} \right) + \left(a_{-2} \times \dfrac{1}{r^2} \right) + \left(a_{-3} \times \dfrac{1}{r^3} \right) + ... + \left(a_{-m} \times \dfrac{1}{r^m} \right)
\end{align*}
&lt;/div&gt;

&lt;p&gt;整数部と小数部を両方持つ数の場合はこう一般化できる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\[ \sum_{i=0}^{n-1} (a_i \times r^{i}) + \sum_{j=1}^{m} (a_{-j} \times r^{-j}) \]
&lt;/div&gt;

&lt;p&gt;数学の文字式では普通、掛け算の演算記号\( \times \)または\( \cdot \)を省略するので次のように書ける。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
\sum_{i=0}^{n-1} a_i r^{i}
&amp;amp;= a_0 r^0 + a_1 r^1 + a_2 r^2 + ... + a_n r^{n-1}
\end{align*}
&lt;/div&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
\sum_{j=1}^{m} a_{-j} r^{-j}
&amp;amp;= a_{-1} r^{-1} + a_{-2} r^{-2} + a_{-3} r^{-3} + \dots + a_{-m} r^{-m} \\
&amp;amp;= a_{-1} \dfrac{1}{r} + a_{-2} \dfrac{1}{r^2} + a_{-3} \dfrac{1}{r^3} + \dots + a_{-m} \dfrac{1}{r^m}
\end{align*}
&lt;/div&gt;

&lt;p&gt;整数部と小数部を両方持つ数の場合は次のとおり。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\[ \sum_{i=0}^{n-1} a_i r^{i} + \sum_{j=1}^{m} a_{-j} r^{-j} = \sum_{k=-m}^{n-1} a_k r^k \]
&lt;/div&gt;

&lt;p&gt;数学記号と数式で表現するとなんだか難しく見えてしまうけれども、その変換規則は各桁を表す定数（係数）にr進数の基数の冪乗を掛けてそれらの値の合計を求める式だから簡単。

&lt;p&gt;ちなみに、この文字式は多項式のように見えるが、小数部の変数rの指数に正数でなく負数が使われているために通常の多項式の条件を満たさない。したがって通常の多項式とは区別されて&lt;dfn&gt;ローラン多項式&lt;/dfn&gt;と呼ばれている。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;\[ \begin{array}{r:l}
i &amp;amp; \text{番号を表す変数} \\
i = 1 &amp;amp; \text{下限値} \\
n &amp;amp; \text{上限値} \\
a_i &amp;amp; \text{i番目の係数（定数）} \\
r^{-i} &amp;amp; \text{負数の指数を持つ変数} \\
\end{array} \]
\[ \sum_{i=1}^n a_i r^{-i} \]&lt;/div&gt;

&lt;p&gt;したがって位取り記数法によって表された数値は、整数部は多項式として展開できるが、小数部はローラン多項式として展開できる。&lt;/p&gt;

&lt;p&gt;あるr進数から別のr進数への変換は&lt;span class=&quot;term&quot;&gt;&lt;ruby&gt;基数変換&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;きすうへんかん&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;&lt;/span&gt;と呼ばれている。&lt;/p&gt;

&lt;h3&gt;16進数&lt;/h3&gt;

&lt;p&gt;計算機科学の中では、2進数を人がより扱いやすくするために16進数を用いて表すことが多い。16進数の表記にはアラビア数字の0〜9とローマ字の大文字A〜Fか小文字a〜fが使われている。&lt;/p&gt;

&lt;table&gt;
&lt;caption&gt;2/4/8/16進数と10進数の対応関係&lt;/caption&gt;
 &lt;tr&gt;
  &lt;th&gt;2進数&lt;/th&gt;
  &lt;th&gt;4進数&lt;/th&gt;
  &lt;th&gt;8進数&lt;/th&gt;
  &lt;th&gt;16進数&lt;/th&gt;
  &lt;th&gt;10進数&lt;/th&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10&lt;/td&gt;
  &lt;td&gt;2&lt;/td&gt;
  &lt;td&gt;2&lt;/td&gt;
  &lt;td&gt;2&lt;/td&gt;
  &lt;td&gt;2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11&lt;/td&gt;
  &lt;td&gt;3&lt;/td&gt;
  &lt;td&gt;3&lt;/td&gt;
  &lt;td&gt;3&lt;/td&gt;
  &lt;td&gt;3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100&lt;/td&gt;
  &lt;td&gt;10&lt;/td&gt;
  &lt;td&gt;4&lt;/td&gt;
  &lt;td&gt;4&lt;/td&gt;
  &lt;td&gt;4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;101&lt;/td&gt;
  &lt;td&gt;11&lt;/td&gt;
  &lt;td&gt;5&lt;/td&gt;
  &lt;td&gt;5&lt;/td&gt;
  &lt;td&gt;5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;110&lt;/td&gt;
  &lt;td&gt;12&lt;/td&gt;
  &lt;td&gt;6&lt;/td&gt;
  &lt;td&gt;6&lt;/td&gt;
  &lt;td&gt;6&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;111&lt;/td&gt;
  &lt;td&gt;13&lt;/td&gt;
  &lt;td&gt;7&lt;/td&gt;
  &lt;td&gt;7&lt;/td&gt;
  &lt;td&gt;7&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000&lt;/td&gt;
  &lt;td&gt;20&lt;/td&gt;
  &lt;td&gt;10&lt;/td&gt;
  &lt;td&gt;8&lt;/td&gt;
  &lt;td&gt;8&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1001&lt;/td&gt;
  &lt;td&gt;21&lt;/td&gt;
  &lt;td&gt;11&lt;/td&gt;
  &lt;td&gt;9&lt;/td&gt;
  &lt;td&gt;9&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1010&lt;/td&gt;
  &lt;td&gt;22&lt;/td&gt;
  &lt;td&gt;12&lt;/td&gt;
  &lt;td&gt;A&lt;/td&gt;
  &lt;td&gt;10&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1011&lt;/td&gt;
  &lt;td&gt;23&lt;/td&gt;
  &lt;td&gt;13&lt;/td&gt;
  &lt;td&gt;B&lt;/td&gt;
  &lt;td&gt;11&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1100&lt;/td&gt;
  &lt;td&gt;30&lt;/td&gt;
  &lt;td&gt;14&lt;/td&gt;
  &lt;td&gt;C&lt;/td&gt;
  &lt;td&gt;12&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1101&lt;/td&gt;
  &lt;td&gt;31&lt;/td&gt;
  &lt;td&gt;15&lt;/td&gt;
  &lt;td&gt;D&lt;/td&gt;
  &lt;td&gt;13&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1110&lt;/td&gt;
  &lt;td&gt;32&lt;/td&gt;
  &lt;td&gt;16&lt;/td&gt;
  &lt;td&gt;E&lt;/td&gt;
  &lt;td&gt;14&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1111&lt;/td&gt;
  &lt;td&gt;33&lt;/td&gt;
  &lt;td&gt;17&lt;/td&gt;
  &lt;td&gt;F&lt;/td&gt;
  &lt;td&gt;15&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10000&lt;/td&gt;
  &lt;td&gt;40&lt;/td&gt;
  &lt;td&gt;20&lt;/td&gt;
  &lt;td&gt;10&lt;/td&gt;
  &lt;td&gt;16&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10001&lt;/td&gt;
  &lt;td&gt;41&lt;/td&gt;
  &lt;td&gt;21&lt;/td&gt;
  &lt;td&gt;11&lt;/td&gt;
  &lt;td&gt;17&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10010&lt;/td&gt;
  &lt;td&gt;42&lt;/td&gt;
  &lt;td&gt;22&lt;/td&gt;
  &lt;td&gt;12&lt;/td&gt;
  &lt;td&gt;18&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10011&lt;/td&gt;
  &lt;td&gt;43&lt;/td&gt;
  &lt;td&gt;23&lt;/td&gt;
  &lt;td&gt;13&lt;/td&gt;
  &lt;td&gt;19&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10100&lt;/td&gt;
  &lt;td&gt;50&lt;/td&gt;
  &lt;td&gt;24&lt;/td&gt;
  &lt;td&gt;14&lt;/td&gt;
  &lt;td&gt;20&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10101&lt;/td&gt;
  &lt;td&gt;51&lt;/td&gt;
  &lt;td&gt;25&lt;/td&gt;
  &lt;td&gt;15&lt;/td&gt;
  &lt;td&gt;21&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10110&lt;/td&gt;
  &lt;td&gt;52&lt;/td&gt;
  &lt;td&gt;26&lt;/td&gt;
  &lt;td&gt;16&lt;/td&gt;
  &lt;td&gt;22&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10111&lt;/td&gt;
  &lt;td&gt;53&lt;/td&gt;
  &lt;td&gt;27&lt;/td&gt;
  &lt;td&gt;17&lt;/td&gt;
  &lt;td&gt;23&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11000&lt;/td&gt;
  &lt;td&gt;60&lt;/td&gt;
  &lt;td&gt;30&lt;/td&gt;
  &lt;td&gt;18&lt;/td&gt;
  &lt;td&gt;24&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11001&lt;/td&gt;
  &lt;td&gt;61&lt;/td&gt;
  &lt;td&gt;31&lt;/td&gt;
  &lt;td&gt;19&lt;/td&gt;
  &lt;td&gt;25&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11010&lt;/td&gt;
  &lt;td&gt;62&lt;/td&gt;
  &lt;td&gt;32&lt;/td&gt;
  &lt;td&gt;1A&lt;/td&gt;
  &lt;td&gt;26&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11011&lt;/td&gt;
  &lt;td&gt;63&lt;/td&gt;
  &lt;td&gt;33&lt;/td&gt;
  &lt;td&gt;1B&lt;/td&gt;
  &lt;td&gt;27&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11100&lt;/td&gt;
  &lt;td&gt;70&lt;/td&gt;
  &lt;td&gt;34&lt;/td&gt;
  &lt;td&gt;1C&lt;/td&gt;
  &lt;td&gt;28&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11101&lt;/td&gt;
  &lt;td&gt;71&lt;/td&gt;
  &lt;td&gt;35&lt;/td&gt;
  &lt;td&gt;1D&lt;/td&gt;
  &lt;td&gt;29&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11110&lt;/td&gt;
  &lt;td&gt;72&lt;/td&gt;
  &lt;td&gt;36&lt;/td&gt;
  &lt;td&gt;1E&lt;/td&gt;
  &lt;td&gt;30&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;11111&lt;/td&gt;
  &lt;td&gt;73&lt;/td&gt;
  &lt;td&gt;37&lt;/td&gt;
  &lt;td&gt;1F&lt;/td&gt;
  &lt;td&gt;31&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100000&lt;/td&gt;
  &lt;td&gt;80&lt;/td&gt;
  &lt;td&gt;40&lt;/td&gt;
  &lt;td&gt;20&lt;/td&gt;
  &lt;td&gt;32&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;16進数を10進数へ基数変換&lt;/h3&gt;

&lt;p&gt;例えば16進数の数8C1を10進数へと基数変換してみる。16進数なので基底16、8C1なので3桁。これらを先程の公式\( \sum_{i=0}^{n-1} x_i r^{i} \)の変数\( r \)と\( n \)にそれぞれ代入すると、\( r = 16 \)、\( n = 3 \)となる。16進数のCは10進数では12に当たるので12として計算する。したがって次のように計算することができる。この計算結果から、16進数の8C1が10進数では2257に対応することが分かる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(8C1)_{16} &amp;amp; \rightarrow (1 \times 16^0 + 12 \times 16^1 + 8 \times 16^2)_{10} \\
&amp;amp; \rightarrow (1 \times 1 + 12 \times 16 + 8 \times 256)_{10} \\
&amp;amp; \rightarrow (1 + 192 + 2048)_{10} \\
&amp;amp; \rightarrow (193 + 2048)_{10} \\
&amp;amp; \rightarrow (2241)_{10}
\end{align*}
&lt;/div&gt;

&lt;p&gt;小数点を持つ16進数の2F.5Aを10進数に基数変換するには、次のように計算することができる。16進数のFは10進数では15、16進数のAは10進数では10なので、その数に置き換えて計算する。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(2F.5A)_{16} &amp;amp; \rightarrow (2 \times 16^1 + 15 \times 16^0 + 5 \times 16^{-1} + 10 \times 16^{-2})_{10} \\
&amp;amp; \rightarrow \left(2 \times 16 + 15 \times 1 + 5 \times \dfrac{1}{16} + 10 \times \dfrac{1}{16^2} \right)_{10} \\
&amp;amp; \rightarrow \left(32 + 15 + 5 \times 0.0625 + 10 \times \dfrac{1}{256} \right)_{10} \\
&amp;amp; \rightarrow (47 + 0.3125 + 10 \times 0.00390625)_{10} \\
&amp;amp; \rightarrow (47.3125 + 0.0390625)_{10} \\
&amp;amp; \rightarrow (47.3515625)_{10}
\end{align*}
&lt;/div&gt;

&lt;table&gt;
&lt;caption&gt;16進数の位を10進数での桁値で表すと&lt;/caption&gt;
 &lt;tr&gt;
  &lt;th&gt;16進数&lt;/th&gt;
  &lt;th&gt;10進数&lt;/th&gt;
  &lt;th&gt;10進冪乗&lt;/th&gt;
  &lt;th&gt;10進対数&lt;/th&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.0001&lt;/td&gt;
  &lt;td&gt;0.00001525879&lt;/td&gt;
  &lt;td&gt;\( 16^{-4} \)&lt;/td&gt;
  &lt;td&gt;-4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.001&lt;/td&gt;
  &lt;td&gt;0.0002441406&lt;/td&gt;
  &lt;td&gt;\( 16^{-3} \)&lt;/td&gt;
  &lt;td&gt;-3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.01&lt;/td&gt;
  &lt;td&gt;0.00390625&lt;/td&gt;
  &lt;td&gt;\( 16^{-2} \)&lt;/td&gt;
  &lt;td&gt;-2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;0.1&lt;/td&gt;
  &lt;td&gt;0.0625&lt;/td&gt;
  &lt;td&gt;\( 16^{-1} \)&lt;/td&gt;
  &lt;td&gt;-1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
  &lt;td&gt;\( 16^0 \)&lt;/td&gt;
  &lt;td&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10&lt;/td&gt;
  &lt;td&gt;16&lt;/td&gt;
  &lt;td&gt;\( 16^1 \)&lt;/td&gt;
  &lt;td&gt;1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100&lt;/td&gt;
  &lt;td&gt;256&lt;/td&gt;
  &lt;td&gt;\( 16^2 \)&lt;/td&gt;
  &lt;td&gt;2&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000&lt;/td&gt;
  &lt;td&gt;4096&lt;/td&gt;
  &lt;td&gt;\( 16^3 \)&lt;/td&gt;
  &lt;td&gt;3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10000&lt;/td&gt;
  &lt;td&gt;65536&lt;/td&gt;
  &lt;td&gt;\( 16^4 \)&lt;/td&gt;
  &lt;td&gt;4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100000&lt;/td&gt;
  &lt;td&gt;1048576&lt;/td&gt;
  &lt;td&gt;\( 16^5 \)&lt;/td&gt;
  &lt;td&gt;5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;1000000&lt;/td&gt;
  &lt;td&gt;16777216&lt;/td&gt;
  &lt;td&gt;\( 16^6 \)&lt;/td&gt;
  &lt;td&gt;6&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;10000000&lt;/td&gt;
  &lt;td&gt;268435456&lt;/td&gt;
  &lt;td&gt;\( 16^7 \)&lt;/td&gt;
  &lt;td&gt;7&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td&gt;100000000&lt;/td&gt;
  &lt;td&gt;4294967296&lt;/td&gt;
  &lt;td&gt;\( 16^8 \)&lt;/td&gt;
  &lt;td&gt;8&lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;10進数から16進数への基数変換&lt;/h3&gt;

&lt;p&gt;上の二つの計算が正しかったかどうか&lt;ruby&gt;検算&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;けんざん&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;するために10進数から16進数への基数変換をしてみる。&lt;/p&gt;
&lt;p&gt;10進数からr進数への基数変換には剰余演算を用いることができる。剰余演算は計算機科学ではモジュロ演算とも呼ばれている。&lt;/p&gt;
&lt;p&gt;10進数の数を変換したい16進数の基数（基底）である16で割っていき、答が0になるまで繰り返せば、それらの余りが対応する16進数の各桁の値になる。この計算から10進数の2241は16進数の8C1に対応することが分かる。この計算法は連続除法や剰余法と呼ばれることがある。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(2241 \div 16 \rightarrow \colorbox{yellow}{140} \text{ 余り} \colorbox{cyan}{1})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 1 = \colorbox{lime}{1})_{16} \\
(\colorbox{yellow}{140} \div 16 \rightarrow \colorbox{yellow}{8} \text{ 余り} \colorbox{cyan}{12})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{C} \times 10 = \colorbox{lime}{C0})_{16} \\
(\colorbox{yellow}{8} \div 16 \rightarrow 0 \text{ 余り} \colorbox{cyan}{8})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{8} \times 100 = \colorbox{lime}{800})_{16}
\end{align*}
\[ \therefore (2241)_{10} \rightarrow (\colorbox{lime}{1} + \colorbox{lime}{C0} + \colorbox{lime}{800} = 8C1)_{16} \]&lt;/div&gt;

&lt;p&gt;上の式ではちょっとわかりにくいので計算の手続きを筆算風の表にしてみた。最初の余りが16進数の1の位に、2番目の余りが16進数の10の位に、3番目の余りが16進数の100の位に、それぞれ対応している。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;\[ \begin{array}{r|l:l}
\text{割る数} &amp;amp; \text{割られる数} &amp;amp; \text{余り} \\
16 &amp;amp; 2241 &amp;amp; \\
\hline
16 &amp;amp; 140 &amp;amp; 1 \\
\hline
16 &amp;amp; 8 &amp;amp; 12 \rightarrow C \\
\hline
&amp;amp; 0 &amp;amp; 8
\end{array} \]
\[ \therefore (8C1)_{16} \]&lt;/div&gt;

&lt;p&gt;次に、10進数の47.3515625を16進数に基数変換する。この場合、整数部と小数部を分けて考え、それぞれ別の方法で求める。整数部は16進数の基底である16で割る計算を繰り返し、それぞれの余りの値が16進数に変換したときの各桁の値になる。&lt;/p&gt;
&lt;p&gt;小数部は逆に16を掛ける計算をする。その答えから整数部を取り除いた値にさらに16を掛ける。そしてその計算を繰り返す。答えの値から小数部がなくなれば計算を終了。それらの答えの整数部の値が16進数に変換したときの各桁の値になる。桁の並べ方が整数部とは逆順（上から下へ）になるので要注意。&lt;/p&gt;

&lt;p&gt;まずは整数部から。10進数の15は16進数ではF。整数部は16進数で2Fと求まる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(47 \div 16 = \colorbox{yellow}{2} \text{ 余り} \colorbox{cyan}{15})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{F} \times 1 = \colorbox{lime}{F})_{16}\} \\
(\colorbox{yellow}{2} \div 16 = 0 \text{ 余り} \colorbox{cyan}{2})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{2} \times 10 = \colorbox{lime}{20})_{16}
\end{align*}
\[ \therefore (47)_{10} \rightarrow (\colorbox{lime}{F} + \colorbox{lime}{20} = 2F)_{16} \]&lt;/div&gt;

&lt;p&gt;筆算風の表にして表すと次のように計算できる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;\[ \begin{array}{r|l:l}
\text{割る数} &amp;amp; \text{割られる数} &amp;amp; \text{余り} \\
\hline
16 &amp;amp; 47 &amp;amp; \\
\hline
16 &amp;amp; 2 &amp;amp; 15 \rightarrow F \\
\hline
&amp;amp; 0 &amp;amp; 2
\end{array} \]
\[ \therefore (2F)_{16} \]&lt;/div&gt;

&lt;p&gt;そして小数部。10進数の10は16進数ではA。小数部は16進数でA5と求まる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(0.3515625 \times 16 = \colorbox{cyan}{5}\colorbox{yellow}{.625})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{5} \times \dfrac{1}{16^1} = \colorbox{lime}{0.5})_{16} \\
(\colorbox{yellow}{0.625} \times 16 = \colorbox{cyan}{10}.0)_{10} &amp;amp; \rightarrow (\colorbox{cyan}{10} \times \dfrac{1}{16^2} = \colorbox{lime}{0.0A})_{16}
\end{align*}
\[ \therefore (0.3515625)_{10} \rightarrow (\colorbox{lime}{0.5} + \colorbox{lime}{0.0A} = 0.5A)_{16} \]&lt;/div&gt;

&lt;p&gt;筆算風の表で表すと次のようになる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;\[ \begin{array}{r|l:l}
掛ける数 &amp;amp; 掛けられる数 &amp;amp; 差し引いた整数部 \\
\hline
16 &amp;amp; 0.3515625 \\
\hline
16 &amp;amp; 0.625 &amp;amp; 5 \\
\hline
16 &amp;amp; 0 &amp;amp; 10 \rightarrow A \end{array} \]
\[ \therefore (0.5A)_{16} \]&lt;/div&gt;

&lt;p&gt;整数部の計算結果と小数部の計算結果を足し合わせると、16進数の2F.A5が求まることが分かる。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\[ \therefore (2F + 0.5A = 2F.5A)_{16} \]
&lt;/div&gt;

&lt;h3&gt;10進数から2進数への基数変換&lt;/h3&gt;

&lt;p&gt;10進数から2進数への基数変換も、整数部、小数部ともに同様の方法で計算することができる。例えば、10進数の87.53を2進数に基数変換するには、次のように計算する。整数部と小数部でそれぞれ別々の計算方法を用いる。&lt;/p&gt;


&lt;p&gt;10進数の整数部を変換したい2進数の基底数である2で割り、その答えを更に2で割る。この計算を答えが0になるまで繰り返す。このときの余りの値は0か1のいずれかになる。それらの余りの値を小さい桁から順番に並べれば2進数へと変換した整数部の値になる。&lt;/p&gt;


&lt;p&gt;10進数の小数部には変換したい2進数の基底数である2を掛け、その答えの小数部だけを取り出し、その小数に更に2を掛ける。この計算を答えが整数部だけになるまで繰り返す。掛け算の各計算の答えの整数部は0か1のいずれかになる。この整数部を大きい桁から順番に並べていけば2進数へと変換された小数部になる。最後に整数部と小数部を足しあわせれば計算が完了する。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(87 \div 2 \rightarrow \colorbox{yellow}{43} \text{ 余り} \colorbox{cyan}{1})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 10^0 = \colorbox{lime}{1})_2 \\
(\colorbox{yellow}{43} \div 2 \rightarrow \colorbox{yellow}{21} \text{ 余り} \colorbox{cyan}{1})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 10^1 = \colorbox{lime}{10})_2 \\
(\colorbox{yellow}{21} \div 2 \rightarrow \colorbox{yellow}{10} \text{ 余り} \colorbox{cyan}{1})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 10^2 = \colorbox{lime}{100})_2 \\
(\colorbox{yellow}{10} \div 2 \rightarrow \colorbox{yellow}{5} \text{ 余り} \colorbox{cyan}{0})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{0} \times 10^3 = 0)_2 \\
(\colorbox{yellow}{5} \div 2 \rightarrow \colorbox{yellow}{2} \text{ 余り} \colorbox{cyan}{1})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 10^4 = \colorbox{lime}{10000})_2 \\
(\colorbox{yellow}{2} \div 2 \rightarrow \colorbox{yellow}{1} \text{ 余り} \colorbox{cyan}{0})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{0} \times 10^5 = 0)_2 \\
(\colorbox{yellow}{1} \div 2 \rightarrow 0 \text{ 余り} \colorbox{cyan}{1})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 10^6 = \colorbox{lime}{1000000})_2
\end{align*}
\[ \therefore (87)_{10} \rightarrow (\colorbox{lime}{1} + \colorbox{lime}{10} + \colorbox{lime}{100} + \colorbox{lime}{10000} + \colorbox{lime}{1000000} = 1010111)_2 \]&lt;/div&gt;

&lt;p&gt;筆算風に表すと次のように書ける。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;\[ \begin{array}{r|l:l}
\text{割る数} &amp;amp; \text{割られる数} &amp;amp; \text{余り} \\
\hline
2 &amp;amp; 87 \\
\hline
2 &amp;amp; 43 &amp;amp; 1 \\
\hline
2 &amp;amp; 21 &amp;amp; 1 \\
\hline
2 &amp;amp; 10 &amp;amp; 1 \\
\hline
2 &amp;amp; 5 &amp;amp; 0 \\
\hline
2 &amp;amp; 2 &amp;amp; 1 \\
\hline
2 &amp;amp; 1 &amp;amp; 0 \\
\hline
&amp;amp; 0 &amp;amp; 1 \end{array} \]
\[ \therefore (1010111)_{2} \]&lt;/div&gt;

&lt;p&gt;次は小数部の計算。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(0.53 \times 2 = \colorbox{cyan}{1}\colorbox{yellow}{.06})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 0.1^1 = \colorbox{lime}{0.1})_2 \\
(\colorbox{yellow}{0.06} \times 2 = \colorbox{cyan}{0}\colorbox{yellow}{.12})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{0} \times 0.1^2 = 0)_2 \\
(\colorbox{yellow}{0.12} \times 2 = \colorbox{cyan}{0}\colorbox{yellow}{.24})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{0} \times 0.1^3 = 0)_2 \\
(\colorbox{yellow}{0.24} \times 2 = \colorbox{cyan}{0}\colorbox{yellow}{.48})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{0} \times 0.1^4 = 0)_2 \\
(\colorbox{yellow}{0.48} \times 2 = \colorbox{cyan}{0}\colorbox{yellow}{.96})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{0} \times 0.1^5 = 0)_2 \\
(\colorbox{yellow}{0.96} \times 2 = \colorbox{cyan}{1}\colorbox{yellow}{.92})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 0.1^6 = \colorbox{lime}{0.00001})_2 \\
(\colorbox{yellow}{0.92} \times 2 = \colorbox{cyan}{1}\colorbox{yellow}{.84})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 0.1^7 = \colorbox{lime}{0.000001})_2 \\
(\colorbox{yellow}{0.84} \times 2 = \colorbox{cyan}{1}\colorbox{yellow}{.68})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 0.1^8 = \colorbox{lime}{0.0000001})_2 \\
(\colorbox{yellow}{0.68} \times 2 = \colorbox{cyan}{1}\colorbox{yellow}{.36})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 0.1^9 = \colorbox{lime}{0.00000001})_2 \\
(\colorbox{yellow}{0.36} \times 2 = \colorbox{cyan}{0}\colorbox{yellow}{.72})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{0} \times 0.1^{10} = 0)_2 \\
(\colorbox{yellow}{0.72} \times 2 = \colorbox{cyan}{1}\colorbox{yellow}{.44})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 0.1^{11} = \colorbox{lime}{0.0000000001})_2 \\
(\colorbox{yellow}{0.44} \times 2 = \colorbox{cyan}{0}\colorbox{yellow}{.88})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{0} \times 0.1^{12} = 0)_2 \\
(\colorbox{yellow}{0.88} \times 2 = \colorbox{cyan}{1}\colorbox{yellow}{.76})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 0.1^{13} = \colorbox{lime}{0.000000000001})_2 \\
(\colorbox{yellow}{0.76} \times 2 = \colorbox{cyan}{1}\colorbox{yellow}{.52})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 0.1^{14} = \colorbox{lime}{0.0000000000001})_2 \\
(\colorbox{yellow}{0.52} \times 2 = \colorbox{cyan}{1}\colorbox{yellow}{.04})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{1} \times 0.1^{15} = \colorbox{lime}{0.00000000000001})_2 \\
(\colorbox{yellow}{0.04} \times 2 = \colorbox{cyan}{0}\colorbox{yellow}{.08})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{0} \times 0.1^{16} = 0)_2 \\
(\colorbox{yellow}{0.08} \times 2 = \colorbox{cyan}{0}\colorbox{yellow}{.16})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{0} \times 0.1^{17} = 0)_2 \\
(\colorbox{yellow}{0.16} \times 2 = \colorbox{cyan}{0}\colorbox{yellow}{.32})_{10} &amp;amp; \rightarrow (\colorbox{cyan}{0} \times 0.1^{18} = 0)_2 \\
&amp;amp; \vdots &amp;amp; \end{align*}
\begin{align*}
\therefore (0.53)_{10} &amp;amp; \rightarrow (\colorbox{lime}{0.1} + \colorbox{lime}{0.00001} \\
&amp;amp; + \colorbox{lime}{0.000001} + \colorbox{lime}{0.0000001} \\
&amp;amp; + \colorbox{lime}{0.0000000001} + \colorbox{lime}{0.000000000001} \\
&amp;amp; + \colorbox{lime}{0.0000000000001} + \colorbox{lime}{0.000000000000001} \\
&amp;amp; + \cdots = 0.100001111010111000...)_{2}
\end{align*}
&lt;/div&gt;
&lt;p&gt;筆算表を使うと次のようになる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{array}{r|l:l}
掛ける数 &amp;amp; 掛けられる数 &amp;amp; 差し引いた整数部 \\
\hline
2 &amp;amp; 0.53 \\
\hline
2 &amp;amp; 0.06 &amp;amp; 1 \\
\hline
2 &amp;amp; 0.12 &amp;amp; 0 \\
\hline
2 &amp;amp; 0.24 &amp;amp; 0 \\
\hline
2 &amp;amp; 0.48 &amp;amp; 0 \\
\hline
2 &amp;amp; 0.96 &amp;amp; 0 \\
\hline
2 &amp;amp; 0.92 &amp;amp; 1 \\
\hline
2 &amp;amp; 0.84 &amp;amp; 1 \\
\hline
2 &amp;amp; 0.68 &amp;amp; 1 \\
\hline
2 &amp;amp; 0.36 &amp;amp; 1 \\
\hline
2 &amp;amp; 0.72 &amp;amp; 0 \\
\hline
2 &amp;amp; 0.44 &amp;amp; 1 \\
\hline
2 &amp;amp; 0.88 &amp;amp; 0 \\
\hline
2 &amp;amp; 0.76 &amp;amp; 1 \\
\hline
2 &amp;amp; 0.52 &amp;amp; 1 \\
\hline
2 &amp;amp; 0.04 &amp;amp; 1 \\
\hline
2 &amp;amp; 0.08 &amp;amp; 0 \\
\hline
2 &amp;amp; 0.16 &amp;amp; 0 \\
\hline
2 &amp;amp; 0.32 &amp;amp; 0 \\
\hline
\vdots &amp;amp; \vdots &amp;amp; \vdots \end{array} \]
\[ \therefore (0.100001111010111000 \dots)_2 \]&lt;/div&gt;
&lt;p&gt;この場合、小数部は計算を繰り返しても繰り返しても答えの小数部が0にならず、おそらくは無限に続く小数になってしまう。そうした場合は途中で中断するよりほかない。&lt;/p&gt;

&lt;p&gt;最後に整数部と小数部を足し合わせる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;
\begin{align*}
\therefore (87.53)_{10} &amp;amp; \rightarrow (1010111 + 0.100001111010111000... \\
&amp;amp;= 1010111.100001111010111000...)_{2}
\end{align*}
&lt;/div&gt;

&lt;h3&gt;10進数からr進数への基数変換のアルゴリズム&lt;/h3&gt;

&lt;p&gt;整数部については一般に次のように求めることができる。xが変換元である10進数の任意の整数、rが変換先の数の基数、yが商、aが余り。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;\begin{align*}
(x \div r = y_1\ \mathrm{余り} a_1)_{10} &amp;amp; \rightarrow (1 \times a_1)_r \\
(y_1 \div r = y_2\ \mathrm{余り} a_2)_{10} &amp;amp; \rightarrow (10 \times a_2)_r \\
(y_2 \div r = y_3\ \mathrm{余り} a_3)_{10} &amp;amp; \rightarrow (100 \times a_3)_r \\
(y_3 \div r = y_4\ \mathrm{余り} a_4)_{10} &amp;amp; \rightarrow (1000 \times a_4)_r \\
&amp;amp; \vdots \\
(y_n \div r = 0\ \mathrm{余り} a_n)_{10} &amp;amp; \rightarrow (10^m \times a_n)_r \end{align*}
\[ \therefore (10^m \times a_n + \dots + 100 \times a_3 + 10 \times a_2 + 1 \times a_1)_r \]&lt;/div&gt;

&lt;p&gt;代数的な表し方をすると次のようになる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
(x = ry_1 + a_1)_{10} &amp;amp; \rightarrow (10^0 \cdot a_1)_r \\
(y_1 = ry_2 + a_2)_{10} &amp;amp; \rightarrow (10^1 \cdot a_2)_r \\
(y_2 = ry_3 + a_3)_{10} &amp;amp; \rightarrow (10^2 \cdot a_3)_r \\
(y_3 = ry_4 + a_4)_{10} &amp;amp; \rightarrow (10^3 \cdot a_4)_r \\
&amp;amp; \vdots \\
(y_n = 0 + a_n)_{10} &amp;amp; \rightarrow (10^m \cdot a_n)_r \end{align*}
\[ \therefore (10^m \cdot a_n + \dots + 100a_3 + 10a_2 + a_1)_r \]&lt;/div&gt;

&lt;p&gt;小数部については次のように計算することができる。ここで\( a.b \)のaは小数の整数部、bは小数部を表す。&lt;/p&gt;

&lt;div class=&quot;math&quot;&gt;
\begin{align*}
(0.x \times r = a_1.b_1)_{10} &amp;amp; \rightarrow  \left(\dfrac{1}{10} \times a_1 \right)_r \\
(b_1 \times r = a_2.b_2)_{10} &amp;amp; \rightarrow  \left(\dfrac{1}{100} \times a_2 \right)_r \\
(b_2 \times r = a_3.b_3)_{10} &amp;amp; \rightarrow  \left(\dfrac{1}{1000} \times a_3 \right)_r \\
&amp;amp; \vdots &amp;amp; \\
(b_n \times r = a_n.0)_{10} &amp;amp; \rightarrow  \left(\dfrac{1}{10^m} \times a_n \right)_r
\end{align*}
\[ \therefore \left(\dfrac{1}{10} \times a_1 + \dfrac{1}{100} \times a_2 + \dfrac{1}{1000} \times a_3 + \dots + \dfrac{1}{10^m} \times a_n \right)_r \]&lt;/div&gt;

&lt;h3&gt;スクリプティング言語の関数やメソッドを利用した基数変換&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.python.org/&quot;&gt;Python 3&lt;/a&gt;では、2進数・8進数・16進数から10進数へ基数変換するためにint()関数を利用することができる。int()関数の第1引数に、変換したい数値を一重引用符か二重引用符で挟んで指定し、第2引数にその基数の値を指定する。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;$ python3
&amp;gt;&amp;gt;&amp;gt; int(&quot;1111&quot;,2)
15
&amp;gt;&amp;gt;&amp;gt; int(&quot;16&quot;,8)
14
&amp;gt;&amp;gt;&amp;gt; int(&quot;1E&quot;,16)
30
&amp;gt;&amp;gt;&amp;gt; exit&lt;/pre&gt;

&lt;p&gt;変換前の数値にプレフィックス（接頭辞）が付けられていても大丈夫。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&amp;gt;&amp;gt;&amp;gt; int(&quot;0b10101&quot;,2)
21
&amp;gt;&amp;gt;&amp;gt; int(&quot;0o37&quot;,8)
31
&amp;gt;&amp;gt;&amp;gt; int(&quot;0x9&quot;,16)
9
&amp;gt;&amp;gt;&amp;gt; exit&lt;/pre&gt;

&lt;p&gt;10進数から2進数へ、10進数から8進数へ、10進数から16進数へ基数変換したいときにはそれぞれに専用の関数が用意されている。2進数へ変換する場合にはbin()関数、8進数へ変換する場合にはoct()関数、16進数へ変換する場合にはhex()関数を利用する。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;&amp;gt;&amp;gt;&amp;gt; bin(125)
&#39;0b1111101&#39;
&amp;gt;&amp;gt;&amp;gt; bin(125)[2:]
&#39;1111101&#39;
&amp;gt;&amp;gt;&amp;gt; oct(56)
&#39;0o70&#39;
&amp;gt;&amp;gt;&amp;gt; oct(56)[2:]
&#39;70&#39;
&amp;gt;&amp;gt;&amp;gt; hex(64)
&#39;0x40&#39;
&amp;gt;&amp;gt;&amp;gt; hex(64)[2:]
&#39;40&#39;
&amp;gt;&amp;gt;&amp;gt; exit&lt;/pre&gt;

&lt;p&gt;これらの関数の出力値にはプレフィックス（接頭辞）が付いてくるが、[2:]によってそれを除去することができる。&lt;/p&gt;

&lt;p&gt;Python 3では、format()関数やstr.format()メソッドにも10進数を2進数ないしは8進数ないしは16進数に基数変換する能力がある。format()関数とstr.format()メソッドでは次の書式指定子を利用する。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2進数はb、&lt;/li&gt;
&lt;li&gt;8進数はo、&lt;/li&gt;
&lt;li&gt;16進数の小文字はx、16進数の大文字はX。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;次の例では10進数の30を2進数・8進数・16進数にそれぞれ基数変換している。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;$ python3
Python 3.13.5
&amp;gt;&amp;gt;&amp;gt; format(30,&#39;b&#39;)
&#39;11110&#39;
&amp;gt;&amp;gt;&amp;gt; &quot;{:b}&quot;.format(30)
&#39;11110&#39;
&amp;gt;&amp;gt;&amp;gt; format(30,&#39;o&#39;)
&#39;36&#39;
&amp;gt;&amp;gt;&amp;gt; &quot;{:o}&quot;.format(30)
&#39;36&#39;
&amp;gt;&amp;gt;&amp;gt; format(30,&#39;x&#39;)
&#39;1e&#39;
&amp;gt;&amp;gt;&amp;gt; &quot;{:x}&quot;.format(30)
&#39;1e&#39;
&amp;gt;&amp;gt;&amp;gt; format(30,&#39;X&#39;)
&#39;1E&#39;
&amp;gt;&amp;gt;&amp;gt; &quot;{:X}&quot;.format(30)
&#39;1E&#39;
&amp;gt;&amp;gt;&amp;gt; exit&lt;/pre&gt;

&lt;p&gt;Python 3ではそのうえさらにf-stringsという文字列リテラルを利用する方法がある。次の例では10進数の31を2進数・8進数・16進数にそれぞれ基数変換している。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;$ python3
Python 3.13.5
&amp;gt;&amp;gt;&amp;gt; f&quot;{31:b}&quot;
&#39;11111&#39;
&amp;gt;&amp;gt;&amp;gt; f&quot;{31:o}&quot;
&#39;37&#39;
&amp;gt;&amp;gt;&amp;gt; f&quot;{31:x}&quot;
&#39;1f&#39;
&amp;gt;&amp;gt;&amp;gt; f&quot;{31:X}&quot;
&#39;1F&#39;
&amp;gt;&amp;gt;&amp;gt; exit&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://www.r-project.org/&quot;&gt;R言語&lt;/a&gt;では2進数・8進数・16進数から10進数への基数変換にstrtoi()関数を利用できる。第1引数には引用符付きで数字を指定し、第2引数にはbase=の後にその数字の基数を指定する。2進数ならば2が基数、8進数ならば8が基数、16進数ならば16が基数。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;$ R
R version 4.5.0
&amp;gt; strtoi(&quot;11111&quot;,base=2)
[1] 31
&amp;gt; strtoi(&quot;37&quot;,base=8)
[1] 31
&amp;gt; strtoi(&quot;1F&quot;,base=16)
[1] 31
&amp;gt; q()
Save workspace image? [y/n/c]: n&lt;/pre&gt;

&lt;p&gt;R言語で10進数から2進数へ基数変換するにはintToBits()関数を利用できる。ただしこの関数はスペースで区切られた2桁の2進法表現をraw型で返す。しかも桁は逆順に並んでいる。そのため、この関数によって返されたデータを整形する処理も一緒に必要になる。&lt;/p&gt;

&lt;p&gt;次に10進数の35を2進数に基数変換する処理の例を示す。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;$ R
R version 4.5.0
&amp;gt; bin1 = intToBits(35L)
&amp;gt; bin1
 [1] 01 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[26] 00 00 00 00 00 00 00
&amp;gt; typeof(bin1)
[1] &quot;raw&quot;
&amp;gt; bin2 = as.integer(bin1)
&amp;gt; bin2
 [1] 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
&amp;gt; bin3 = rev(bin2)
&amp;gt; bin3
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1
&amp;gt; bin4 = paste(bin3,collapse=&quot;&quot;)
&amp;gt; bin4
[1] &quot;00000000000000000000000000100011&quot;
&amp;gt; bin5 = sub(&quot;^0+&quot;,&quot;&quot;,bin4)
&amp;gt; bin5
[1] &quot;100011&quot;
&amp;gt; q()
Save workspace image? [y/n/c]: n&lt;/pre&gt;

&lt;p&gt;数値リテラルの35Lは35がInteger型の数値であることを表している。それをintToBits()関数に入力して出力された値を変数bin1に代入。しかし出力された値をtypeof()関数で調べてみるとraw型になってしまっている。as.integer()関数によってそれを再びInteger型に戻して変数bin2に代入。次にrev()関数で桁順を反転させて変数bin3に代入。次にpaste()関数によって数字間の空白を取り除いて変数bin4に代入。次にsub()関数によって余分な0を取り除いて最終的な結果を変数bin5に代入している。ただしrev()関数はpaste()関数より前で使う必要があることに要注意。&lt;/p&gt;

&lt;p&gt;ちなみに、R言語の代入演算子は&lt;code&gt;&amp;lt;-&lt;/code&gt;のはずだと思われたかもしれが、左辺への代入ならば&lt;code&gt;=&lt;/code&gt;が使える。&lt;/p&gt;

&lt;p&gt;R言語で10進数から16進数へ基数変換するにはas.hexmode()関数が便利。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;$ R
R version 4.5.0
&amp;gt; as.hexmode(35L)
[1] &quot;23&quot;
&amp;gt; q()
Save workspace image? [y/n/c]: n&lt;/pre&gt;

&lt;p&gt;R言語で10進数を8進数へと基数変換する便利な方法はどうもないらしい。上述したアルゴリズムをコード化してちょっとしたスクリプトを組むしかないと思う。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://octave.org/&quot;&gt;GNU Octave&lt;/a&gt;ではbase2dec()関数とdec2base()関数を利用できる。base2dec()関数はr進数から10進数への基数変換をしてくれ、dec2base()関数は10進数からr進数への基数変換をしてくれる。&lt;/p&gt;
&lt;p&gt;base2dec()関数では第1引数に変換したい数値を引用符で挟んで指定し、第2引数には第1引数で指定した数値の基数（何進数か）を指定する。dec2base()関数では第1引数に変換したい10進数の数値を指定し、第2引数に変換後の数値の基数（何進数へ変換したいか）を指定する。引数の指定方法が異なることに要注意。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;$ octave
GNU Octave, version 9.4.0
octave:1&amp;gt; base2dec(&quot;11011&quot;,2)
ans = 27
octave:2&amp;gt; dec2base(27,2)
ans = 11011
octave:3&amp;gt; base2dec(&quot;33&quot;,8)
ans = 27
octave:4&amp;gt; dec2base(27,8)
ans = 33
octave:5&amp;gt; base2dec(&quot;1b&quot;,16)
ans = 27
octave:6&amp;gt; dec2base(27,16)
ans = 1B
octave:7&amp;gt; exit&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://julialang.org/&quot;&gt;Julia&lt;/a&gt;ではstring()関数とparse()関数を利用できる。string()関数は10進数からr進数へ基数変換してくれ、parse()関数はr進数から10進数へ基数変換してくれる。&lt;/p&gt;

&lt;p&gt;string()関数の第1引数には10進数を指定して第2引数にはbase=で変換先の基数を指定する。parse()関数の第1引数にはデータ型名を指定し、第2引数に文字列リテラルとして変換前の数値を指定し、第3引数では第2引数で指定した数値の基数を指定する。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;$ julia
Version 1.11.6
julia&amp;gt; string(8,base=2)
&quot;1000&quot;

julia&amp;gt; parse(Int,&quot;1000&quot;,base=2)
8

julia&amp;gt; string(12,base=8)
&quot;14&quot;

julia&amp;gt; parse(Int,&quot;14&quot;,base=8)
12

julia&amp;gt; string(13,base=16)
&quot;d&quot;

julia&amp;gt; parse(Int,&quot;d&quot;,base=16)
13

julia&amp;gt; exit()&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://www.ruby-lang.org/ja/&quot;&gt;Ruby&lt;/a&gt;では基数変換のために整数オブジェクトの.to_s()メソッドと文字列オブジェクトの.to_i()メソッドを利用することができる。.to_s()メソッドは10進数をr進数へ基数変換するために利用でき、.to_i()メソッドはr進数を10進数に基数変換するために利用できる。&lt;/p&gt;
&lt;p&gt;整数オブジェクトの.to_s()メソッドでは()に変換先の基数を指定するが、文字列オブジェクトの.to_i()メソッドでは()に変換元の基数を指定するという違いがある。&lt;/p&gt;
&lt;p&gt;ここではRubyのREPL（レプル）であるIRBを利用した。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;$ ruby -v
ruby 3.3.8
$ irb -v
irb 1.13.1
$ irb
irb(main):001&amp;gt; 52.to_s(2)
=&amp;gt; &quot;110100&quot;
irb(main):002&amp;gt; &quot;110100&quot;.to_i(2)
=&amp;gt; 52
irb(main):003&amp;gt; 37.to_s(8)
=&amp;gt; &quot;45&quot;
irb(main):004&amp;gt; &quot;45&quot;.to_i(8)
=&amp;gt; 37
irb(main):005&amp;gt; 29.to_s(16)
=&amp;gt; &quot;1d&quot;
irb(main):006&amp;gt; &quot;1D&quot;.to_i(16)
=&amp;gt; 29
irb(main):007&amp;gt; exit&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://www.java.com/ja/&quot;&gt;Java&lt;/a&gt;で基数変換をするにはIntegerクラスやLongクラスの.toString()メソッドと.parseInt()メソッドを利用することができる。.toString()メソッドは10進数からr進数への基数変換に利用でき、.parseInt()メソッドはr進数から10進数への基数変換に利用できる。&lt;/p&gt;
&lt;p&gt;.toString()メソッドでは第1引数にint型の10進数を指定し、第2引数に変換先の基数を指定する。.parseInt()メソッドでは第1引数にn進数をstring型で指定し、第2引数にその基数を指定する。&lt;/p&gt;

&lt;p&gt;JavaにはJShellというREPL（レプル）があるのでここではそれを利用した。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;$ jshell
|  JShellへようこそ -- バージョン21.0.8
|  概要については、次を入力してください: /help intro

jshell&amp;gt; Integer.toString(25,2);
$1 ==&amp;gt; &quot;11001&quot;

jshell&amp;gt; Integer.parseInt(&quot;11001&quot;,2);
$2 ==&amp;gt; 25

jshell&amp;gt; Integer.toString(25,8);
$3 ==&amp;gt; &quot;31&quot;

jshell&amp;gt; Integer.parseInt(&quot;31&quot;,8);
$4 ==&amp;gt; 25

jshell&amp;gt; Integer.toString(28,16);
$5 ==&amp;gt; &quot;1c&quot;

jshell&amp;gt; Integer.parseInt(&quot;1c&quot;,16);
$6 ==&amp;gt; 28

jshell&amp;gt; /exit
|  終了します&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;&quot;&gt;Scala&lt;/a&gt;でもJavaとまったく同じやり方でIntegerクラスやLongクラスの.toString()メソッドとparseInt()メソッドを使って基数変換を行うことができる。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;$ scala
Welcome to Scala 2.11.12 (OpenJDK 64-Bit Server VM, Java 21.0.8).
Type in expressions for evaluation. Or try :help.

scala&amp;gt; Integer.toString(31,2)
res0: String = 11111

scala&amp;gt; Integer.parseInt(&quot;11111&quot;,2)
res1: Int = 31

scala&amp;gt; Integer.toString(31,8)
res2: String = 37

scala&amp;gt; Integer.parseInt(&quot;37&quot;,8)
res3: Int = 31

scala&amp;gt; Integer.toString(31,16)
res4: String = 1f

scala&amp;gt; Integer.parseInt(&quot;1f&quot;,16)
res5: Int = 31

scala&amp;gt; sys.exit&lt;/pre&gt;

&lt;p&gt;また、BigIntクラスを利用して大きい数値を扱うこともできる。&lt;/p&gt;

&lt;pre class=&quot;shell&quot;&gt;scala&amp;gt; var bigHex = BigInt(&quot;ffffff&quot;,16)
bigHex: scala.math.BigInt = 16777215

scala&amp;gt; bigHex.toString(2)
res9: String = 111111111111111111111111

scala&amp;gt; bigHex.toString(8)
res10: String = 77777777

scala&amp;gt; bigHex.toString(10)
res11: String = 16777215

scala&amp;gt; sys.exit&lt;/pre&gt;

&lt;p&gt;残念ながらここで挙げたいくつかのスクリプティング言語の関数やメソッドはすべて整数部の基数変換にしか対応していない。小数部はアルゴリズムが異なるため、それ向けのスクリプトを書く必要がある。&lt;/p&gt;

&lt;div class=&quot;fieldset&quot;&gt;
&lt;h3 class=&quot;legend&quot;&gt;まとめ&lt;/h3&gt;
&lt;h4&gt;r進数&lt;/h4&gt;
&lt;dl&gt;
  &lt;dt&gt;10進数(decimal numbers)&lt;/dt&gt;
 &lt;dd&gt;10を基底とする位取り記数法。0, 1, 2, 3, 4, 5, 6, ..., 9, 10, 11 , 12, ...19, 20, 21, ..., 99, 100, 101, ...のように位を上げてゆく数え方。&lt;/dd&gt;
 &lt;/dl&gt;
&lt;dl&gt;
 &lt;dt&gt;2進数(binary numbers)&lt;/dt&gt;
 &lt;dd&gt;2を基底とする位取り記数法。0と1の数字だけを用いて、0, 1, 10, 11, 100, 101, 110, 111, 1000, ...のように位を上げてゆく数え方。&lt;/dd&gt;
 &lt;/dl&gt;
&lt;dl&gt;
 &lt;dt&gt;16進数(hexadecimal numbers)&lt;/dt&gt;
 &lt;dd&gt;16を基底とする位取り記数法。0〜9の次はA, B, C, D, E, F 10, 11, 12, ..., 19, 1A, 1B,..., 1F, 20, 21, ...のように位を上げてゆく数え方。&lt;/dd&gt;
 &lt;/dl&gt;
&lt;dl&gt;
 &lt;dt&gt;位取り記数法&lt;/dt&gt;
 &lt;dd&gt;数に&lt;ruby&gt;位&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;くらい&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;という概念を導入し、1つ下の位で数字がひと通り数えられるごとに1つ上の位に1つずつ繰り上がってゆく数え方およびその記数法。位は&lt;ruby&gt;桁&lt;rp&gt;（&lt;/rp&gt;&lt;rt&gt;けた&lt;/rt&gt;&lt;rp&gt;）&lt;/rp&gt;&lt;/ruby&gt;とも呼ぶ。&lt;/dd&gt;
 &lt;/dl&gt;
&lt;dl&gt;
 &lt;dt&gt;桁値（重み）&lt;/dt&gt;
 &lt;dd&gt;位取り記数法において各桁（各位）はそれぞれ異なる数の単位を表している。その単位は桁値または重みと呼ばれている。それぞれの桁の数字はその桁値だけ倍にした数であることを意味している。例えば10進法では、10の位は10倍を意味し、100の位は100倍を意味している。2進法では、10（イチゼロ）の位は10進法での2倍に相当し、100（イチゼロゼロ）の位は10進法での4倍に相当している。&lt;/dd&gt;
&lt;/dl&gt;

&lt;h4&gt;r進数から10進数への基数変換のアルゴリズム&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;与えられた数値を整数部と小数部とに分ける。&lt;/p&gt;
&lt;p&gt;16進数を10進数へ基数変換する例を挙げてみた。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ (E941.0F5)_{16} = (E941)_{16} + (0.0F5)_{16} \]&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;整数部の各桁を10進数における「各桁の値×桁値」に基数変換し、それらすべての桁を表す項を足し合わせた総和の式にする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ (E941)_{16} \rightarrow (14 \times 16^3 + 9 \times 16^2 + 4 \times 16^1 + 1 \times 16^0)_{10} \]&lt;/div&gt;
&lt;p&gt;Eは10進数では14に当たる。整数部では1の位の桁値の指数が0から始まることに要注意。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;小数部の各桁を10進数における「各桁の値×桁値」に基数変換し、それらすべての桁を表す項を足し合わせた総和の式にする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[
(0.0F5)_{16} \rightarrow (0 \times \dfrac{1}{16} + 15 \times \dfrac{1}{16^2} + 5 \times \dfrac{1}{16^3})_{10} \]&lt;/div&gt;
&lt;p&gt;Fは10進数では15に当たる。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;整数部を計算する。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
&amp;amp; (14 \times 16^3 + 9 \times 16^2 + 4 \times 16^1 + 1 \times 16^0)_{10} \\
&amp;amp; = (14 \times 4096 + 9 \times 256 + 4 \times 16 + 1 \times 1)_{10} \\
&amp;amp; = (57344 + 2304 + 64 + 1)_{10} \\
&amp;amp; = (59713)_{10} \end{align*}&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;小数部を計算する。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
&amp;amp; (0 \times \dfrac{1}{16} + 15 \times \dfrac{1}{16^2} + 5 \times \dfrac{1}{16^3})_{10} \\
&amp;amp; = (0 \times 0.0625 + 15 \times 0.00390625 + 5 \times 0.000244140625)_{10} \\
&amp;amp; = (0 + 0.05859375 + 0.001220703125)_{10} \\
&amp;amp; = (0.059814453125)_{10} \end{align*}&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;整数部の計算結果と小数部の計算結果を足し合わせる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ (59713 + 0.059814453125)_{10} = (59713.059814453125)_{10} \]&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;10進数・2進数・8進数・16進数の桁値（各々の位の重み）&lt;/h4&gt;

&lt;table&gt;
&lt;caption&gt;10進数とその桁値&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;10進数の桁&lt;/th&gt;
&lt;th&gt;桁値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.0000000001&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{10^{10}} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.000000001&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{10^9} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.00000001&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{10^8} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.0000001&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{10^7} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.000001&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{10^6} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.00001&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{10^5} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.0001&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{10^4} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.001&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{10^3} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{10^2} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.1&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{10^1} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;\( 10^0 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;\( 10^1 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;\( 10^2 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;\( 10^3 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000&lt;/td&gt;
&lt;td&gt;\( 10^4 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100000&lt;/td&gt;
&lt;td&gt;\( 10^5 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000000&lt;/td&gt;
&lt;td&gt;\( 10^6 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000000&lt;/td&gt;
&lt;td&gt;\( 10^7 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100000000&lt;/td&gt;
&lt;td&gt;\( 10^8 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000000000&lt;/td&gt;
&lt;td&gt;\( 10^9 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000000000&lt;/td&gt;
&lt;td&gt;\( 10^{10} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;br&gt;

&lt;table&gt;
&lt;caption&gt;2進数とその桁値（10進数表記）&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;2進数の桁&lt;/th&gt;
&lt;th&gt;対応する10進数&lt;/th&gt;
&lt;th&gt;桁値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.00000000001&lt;/td&gt;
&lt;td&gt;0.0009765625&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{2^{10}} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.0000000001&lt;/td&gt;
&lt;td&gt;0.001953125&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{2^9} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.000000001&lt;/td&gt;
&lt;td&gt;0.00390625&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{2^8} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.00000001&lt;/td&gt;
&lt;td&gt;0.0078125&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{2^7} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.0000001&lt;/td&gt;
&lt;td&gt;0.015625&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{2^6} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.000001&lt;/td&gt;
&lt;td&gt;0.03125&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{2^5} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.00001&lt;/td&gt;
&lt;td&gt;0.0625&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{2^4} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.0001&lt;/td&gt;
&lt;td&gt;0.125&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{2^3} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{2^2} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.1&lt;/td&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{2^1} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;\( 2^0 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;\( 2^1 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;\( 2^2 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;\( 2^3 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;\( 2^4 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100000&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;\( 2^5 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000000&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;\( 2^6 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000000&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;\( 2^7 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100000000&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;\( 2^8 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000000000&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;td&gt;\( 2^9 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000000000&lt;/td&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;td&gt;\( 2^{10} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;br&gt;

&lt;table&gt;
&lt;caption&gt;8進数とその桁値（10進数表記）&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;8進数の桁&lt;/th&gt;
&lt;th&gt;対応する10進数&lt;/th&gt;
&lt;th&gt;桁値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.0000000001&lt;/td&gt;
&lt;td&gt;0.0000000009313226&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{8^{10}} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.000000001&lt;/td&gt;
&lt;td&gt;0.000000007450581&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{8^9} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.00000001&lt;/td&gt;
&lt;td&gt;0.00000005960464&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{8^8} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.0000001&lt;/td&gt;
&lt;td&gt;0.0000004768372&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{8^7} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.000001&lt;/td&gt;
&lt;td&gt;0.000003814697&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{8^6} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.00001&lt;/td&gt;
&lt;td&gt;0.00003051758&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{8^5} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.0001&lt;/td&gt;
&lt;td&gt;0.0002441406&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{8^4} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.001&lt;/td&gt;
&lt;td&gt;0.001953125&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{8^3} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;0.015625&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{8^2} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.1&lt;/td&gt;
&lt;td&gt;0.125&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{8^1} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;\( 8^0 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;\( 8^1 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;\( 8^2 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;td&gt;\( 8^3 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000&lt;/td&gt;
&lt;td&gt;4096&lt;/td&gt;
&lt;td&gt;\( 8^4 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100000&lt;/td&gt;
&lt;td&gt;32768&lt;/td&gt;
&lt;td&gt;\( 8^5 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000000&lt;/td&gt;
&lt;td&gt;262144&lt;/td&gt;
&lt;td&gt;\( 8^6 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000000&lt;/td&gt;
&lt;td&gt;2097152&lt;/td&gt;
&lt;td&gt;\( 8^7 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100000000&lt;/td&gt;
&lt;td&gt;16777216&lt;/td&gt;
&lt;td&gt;\( 8^8 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000000000&lt;/td&gt;
&lt;td&gt;134217728&lt;/td&gt;
&lt;td&gt;\( 8^9 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000000000&lt;/td&gt;
&lt;td&gt;1073741824&lt;/td&gt;
&lt;td&gt;\( 8^{10} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;br&gt;

&lt;table&gt;
&lt;caption&gt;16進数とその桁値（10進数表記）&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;16進数の桁&lt;/th&gt;
&lt;th&gt;対応する10進数&lt;/th&gt;
&lt;th&gt;桁値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.0000000001&lt;/td&gt;
&lt;td&gt;0.0000000000009094947&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{16^{10}} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.000000001&lt;/td&gt;
&lt;td&gt;0.00000000001455192&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{16^9} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.00000001&lt;/td&gt;
&lt;td&gt;0.0000000002328306&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{16^8} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.0000001&lt;/td&gt;
&lt;td&gt;0.00000000372529&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{16^7} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.000001&lt;/td&gt;
&lt;td&gt;0.00000005960464&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{16^6} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.00001&lt;/td&gt;
&lt;td&gt;0.0000009536743&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{16^5} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.0001&lt;/td&gt;
&lt;td&gt;0.00001525879&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{16^4} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.001&lt;/td&gt;
&lt;td&gt;0.0002441406&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{16^3} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.01&lt;/td&gt;
&lt;td&gt;0.00390625&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{16^2} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.1&lt;/td&gt;
&lt;td&gt;0.0625&lt;/td&gt;
&lt;td&gt;\( \dfrac{1}{16^1} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;\( 16^0 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;\( 16^1 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;\( 16^2 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;4096&lt;/td&gt;
&lt;td&gt;\( 16^3 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000&lt;/td&gt;
&lt;td&gt;65536&lt;/td&gt;
&lt;td&gt;\( 16^4 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100000&lt;/td&gt;
&lt;td&gt;1048576&lt;/td&gt;
&lt;td&gt;\( 16^5 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000000&lt;/td&gt;
&lt;td&gt;16777216&lt;/td&gt;
&lt;td&gt;\( 16^6 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000000&lt;/td&gt;
&lt;td&gt;268435456&lt;/td&gt;
&lt;td&gt;\( 16^7 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100000000&lt;/td&gt;
&lt;td&gt;4294967296&lt;/td&gt;
&lt;td&gt;\( 16^8 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000000000&lt;/td&gt;
&lt;td&gt;68719476736&lt;/td&gt;
&lt;td&gt;\( 16^9 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100000000000&lt;/td&gt;
&lt;td&gt;1099511627776&lt;/td&gt;
&lt;td&gt;\( 16^{10} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;h4&gt;10進数からr進数への基数変換のアルゴリズム&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;与えられた数値を整数部と小数部とに分かる。&lt;/p&gt;
&lt;p&gt;ここでは10進数の59713.059814453125を16進数へ基数変換する例を挙げる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ (59713.059814453125)_{10} = (59713)_{10} + (0.059814453125)_{10} \]&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;整数部に連続除法（剰余法）を適用する。&lt;/p&gt;
&lt;p&gt;ここで連続除法（剰余法）とは次のことを指す。各桁の値を変換したい基数で割り算し、その余りを記録し、そして割り算の答えの整数部を更に基数で割り算し、その余りを記録し、これを答えがゼロに達するまで繰り返す。答えが循環小数になる場合は適当なところで計算を打ち切る。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{array}{r|l:l}
\text{割る数} &amp;amp; \text{割られる数} &amp;amp; \text{余り} \\
\hline
16 &amp;amp; 59713 \\
\hline
16 &amp;amp; 3732 &amp;amp; 1 \\
\hline
16 &amp;amp;  233 &amp;amp; 4 \\
\hline
16 &amp;amp; 14 &amp;amp; 9 \\
\hline
&amp;amp; 0 &amp;amp; 14 \rightarrow E
\end{array} \]
\[ \therefore E941 \]&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;小数部に乗算法を適用する。&lt;/p&gt;
&lt;p&gt;ここで乗算法とは次のことを指す。各桁の値（小数）を変換したい基数で掛け算し、その答えから整数部を差し引いた値を更に基数で掛け算し、小数部がゼロになるまでこの計算を繰り返す。その際、各桁の乗算ごとに得られた整数部の値を記録する。掛けても掛けても小数部が無くならない場合は適当なところで計算を打ち切る。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{array}{r|l:l}
\text{掛ける数} &amp;amp; \text{掛けられる数} &amp;amp; \text{差し引いた整数部}\\
\hline
16 &amp;amp; 0.059814453125 \\
\hline
16 &amp;amp; 0.95703125 &amp;amp; 0 \\
\hline
16 &amp;amp; 0.3125 &amp;amp; 15 \rightarrow F \\
\hline
16 &amp;amp; 0 &amp;amp; 5 \end{array} \]
\[ \therefore 0.0F5 \]&lt;/div&gt;
&lt;p&gt;\( 16 \times 0.95703125 = 15.3125 \)になるが、そこから整数部である15を差し引いて\( 15.3125 - 15 = 0.3125 \)、小数部の0.3125だけを次の「掛けられる数」にする点に要注意。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;得られた数値の整数部と小数部を足し合わせる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ (E941)_{16} + (0.0F5)_{16} = (E941.0F5)_{16} \]&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/3807450493675034605/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2025/08/n.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/3807450493675034605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/3807450493675034605'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2025/08/n.html' title='n進数と基数変換'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-2027932070446766040</id><published>2025-04-03T11:08:00.004+09:00</published><updated>2025-09-04T03:56:21.937+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Geany"/><category scheme="http://www.blogger.com/atom/ns#" term="jEdit"/><category scheme="http://www.blogger.com/atom/ns#" term="プログラミング"/><title type='text'>テキストエディタ、GeanyとjEditのエディタの行間の大きさを設定</title><content type='html'>&lt;p&gt;使っているテキスト・エディタ、GeanyとjEditの行間が狭すぎて見にくいので変更してみた。フォントやフォントの大きさの設定と比べて分かりにくかったのでブログに記しておく。&lt;/p&gt;
&lt;p&gt;GeanyとjEditのバージョンを確認。&lt;/p&gt;
&lt;h5&gt;ソフトウェアのバージョン&lt;/h5&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ geany -V
geany 2.0
$ jedit -version
jEdit 5.5.0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;まずはGeanyでの手順。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Geanyを起動。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ geany &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;メニュー・バー（トップ・メニュー）の「ツール」-「設定ファイル」-「filetypes.common」&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[styling]と共に「line_height=上の行間の値;下の行間の値;」という書式で次のようなコードを追加する。ただし「」は無視。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;[styling]
line_height=3;3;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;メニュー・バー（トップ・メニュー）の「ファイル」-「保存」か[Ctrl]+sで上書き保存。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;次にjEditでの手順。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;jEditを起動。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ jedit &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;メニュー・バー（トップ・メニュー）の「ユーティリティ」-「グローバル オプション」&lt;/li&gt;
&lt;li&gt;「Global Options」タブの「jEdit」ディレクトリの「テキスト エリア」を選ぶ。&lt;/li&gt;
&lt;li&gt;「追加の水平行間隔（ピクセル単位）にピクセル単位で数値（6あたりが丁度いいと思った）を入力して「OK」ボタンか「適用」ボタンを押す。&lt;/li&gt;
&lt;/ol&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/2027932070446766040/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2025/04/geanyjedit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/2027932070446766040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/2027932070446766040'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2025/04/geanyjedit.html' title='テキストエディタ、GeanyとjEditのエディタの行間の大きさを設定'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-3687589720236251104</id><published>2025-03-05T12:42:00.006+09:00</published><updated>2025-04-08T09:42:13.685+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Debian trixie"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><title type='text'>LXQtとOpenboxのショートカットキー</title><content type='html'>&lt;p&gt;LXQt/Openboxのショートカット・キーの一覧であるけれどもLXDE/Openboxでも通用するものが多いはず。ただしLXDEでは有効に機能するはずの一部のショートカット・キーがLXQtでは機能しないようなので要注意。&lt;/p&gt;
&lt;p&gt;ちなみにショートカット・キーはキーボード・ショートカットともホットキーともキーバインディングとも呼ばれている。&lt;/p&gt;
&lt;p&gt;パソコンの種類によってキーボードの配列が異なることがあるので、それについて予め言及しておく必要があると思う。&lt;/p&gt;
&lt;p&gt;WindowsパソコンではCtrキーとAltキーの間に挟まれたWindowsキー（Winキー）がMetaキーの役目を果たす。AppleのパソコンではAltキーがOptionキーに当たり、MetaキーはCommandキーに当たる。Chromebookではctrlキーとaltキーがあるが、metaキーがない。その代わりにChromebookの仮想Linux OS環境であるCrostiniでは虫眼鏡のアイコンが描かれた検索キーにMetaキーの機能が割り当てられることが多いようだ。&lt;/p&gt;
&lt;p&gt;ちなみにMetaキーはSuperキーともHyperキーとも呼ばれている。&lt;/p&gt;
&lt;p&gt;用語の説明も若干必要かもしれない。&lt;/p&gt;
&lt;p&gt;「アクティブなウィンドウ」とは操作対象になっている最中のウィンドウのこと。「アクティブなデスクトップ」とは画面に表示中のデスクトップのこと。&lt;/p&gt;
&lt;section&gt;
&lt;dl&gt;
&lt;dt&gt;LxPanelのメニューを表示する&lt;/dt&gt;
&lt;dd&gt;Alt + F1&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;メニューを順番に選ぶには矢印キーを利用する。選んだメニューを実行するにはEnterキーを使う。&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;LxPanelのメニューを閉じる&lt;/dt&gt;
&lt;dd&gt;Esc&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;コマンド入力によるアプリの起動&lt;/dt&gt;
&lt;dd&gt;Alt + F2&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;実行コマンド・ダイアログには履歴機能があり、コマンドにオプションや引数も付け加えられる。アプリの起動の際にオプションや引数を添えて実行したい場合には便利。実行コマンド・ダイアログを閉じるためにはもう一度Alt + F2を押すかEscキーを使う。&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;アクティブなウィンドウを切り替える&lt;/dt&gt;
&lt;dd&gt;
&lt;p class=&quot;nonindent&quot;&gt;Alt + tab&lt;/p&gt;
&lt;p&gt;または&lt;/p&gt;
&lt;p class=&quot;nonindent&quot;&gt;Alt + Esc&lt;/p&gt;
&lt;p&gt;または&lt;/p&gt;
&lt;p class=&quot;nonindent&quot;&gt;Meta + Shift + 任意の矢印キー&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;アクティブなウィンドウを逆順で切り替える&lt;/dt&gt;
&lt;dd&gt;Alt + Shift + tab&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;アクティブなデスクトップを右向きに順番に切り替える&lt;/dt&gt;
&lt;dd&gt;Ctrl + Alt + →&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;アクティブなデスクトップを左向きに順番に切り替える&lt;/dt&gt;
&lt;dd&gt;Ctrl + Alt + ←&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;デスクトップ1へとアクティブなデスクトップを切り替える&lt;/dt&gt;
&lt;dd&gt;Meta + F1&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;デスクトップ2へとアクティブなデスクトップを切り替える&lt;/dt&gt;
&lt;dd&gt;Meta + F2&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;アクティブなウィンドウを全画面化する（すでに全画面化している場合は元に戻す）&lt;/dt&gt;
&lt;dd&gt;F11&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;アクティブなウィンドウを閉じる&lt;/dt&gt;
&lt;dd&gt;Alt + F4&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;アクティブなウィンドウの操作メニューを表示する&lt;/dt&gt;
&lt;dd&gt;Alt + Space&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;アクティブなウィンドウの操作メニューを順番に選ぶには矢印キーを使う。割り当てられたキーバインディング（カッコ内に示されている）を利用して選ぶこともできる。選んだメニューの実行にはEnterキーを使う。&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;ウィンドウの操作メニューを閉じる&lt;/dt&gt;
&lt;dd&gt;Esc&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;アクティブのウィンドウのデスクトップ上の位置を移動する&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
&lt;li&gt;Alt + Spaceでアクティブなウィンドウの操作メニューを表示する。&lt;/li&gt;
&lt;li&gt;Mキーを押すか「移動」というメニューを矢印キーで選んでEnterキーを押す。&lt;/li&gt;
&lt;li&gt;矢印キーを使って任意の位置へ移動する。&lt;/li&gt;
&lt;li&gt;移動先の位置が確定したらEnterキーを押す。移動を取り消したいときにはEscキーを押す。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;または&lt;/p&gt;
&lt;p&gt;Alt + マウスをクリックして移動&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Mキーは「M」と書かれてあるキーのこと。「Mキーを押す」とは小文字のmをキーボードで入力することと同じ。&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;アクティブなウィンドウを別のディスクトップへ送る&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
&lt;li&gt;Alt + Spaceでアクティブなウィンドウの操作メニューを表示する。&lt;/li&gt;
&lt;li&gt;Sキーを押すか矢印キーを使って「デスクトップに送る」からデスクトップ名を選んでEnterキーを押す。&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;アクティブなウィンドウを最小化する&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
&lt;li&gt;Alt + Spaceでアクティブなウィンドウの操作メニューを表示する。&lt;/li&gt;
&lt;li&gt;Nキーを押すか矢印キーを使って「最小化」を選んでEnterキーを押す。&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;アクティブなウィンドウを最大化する&lt;/dt&gt;
&lt;dd&gt;
&lt;ol&gt;
&lt;li&gt;Alt + Spaceでアクティブなウィンドウの操作メニューを表示する。&lt;/li&gt;
&lt;li&gt;Xキーを押すか矢印キーを使って「最大化」を選んでEnterキーを押す。&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;デスクトップを表示・非表示する&lt;/dt&gt;
&lt;dd&gt;Meta + d&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;設定ファイルはホーム・ディレクトリの.config/openbox/にあるrc.xmlがそれ。ショートカット・キーはその中のkeyboard要素に挟まれたkeybind要素のname属性で定義されている。&lt;/p&gt;
&lt;/section&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/3687589720236251104/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2025/03/lxqtopenbox.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/3687589720236251104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/3687589720236251104'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2025/03/lxqtopenbox.html' title='LXQtとOpenboxのショートカットキー'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-311061643719354674</id><published>2025-01-17T22:02:00.004+09:00</published><updated>2026-02-27T10:43:21.161+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Debian trixie"/><title type='text'>Debian 13へのEPSON GT-S600のデバイスドライバのインストールに失敗</title><content type='html'>&lt;p&gt;Debian GNU/Linux 13 (trixie)でEPSON GT-S600というスキャナーを動作させるには次のウェブ・ページからdebパッケージになったデバイス・ドライバーをダウンロードしてインストールする必要がある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;a href=&#39;https://download.ebz.epson.net/dsc/search/01/search/&#39;&gt;EPSONドライバーダウンロード&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;そこの検索フォームに製品名としてGT-S600を入力し、OSとしてLinuxを選んで検索すると1件のヒットがある。その「ダウンロード』ボタンをクリックした後、ダウンロードする前に「エプソンのソフトウエア使用許諾契約」に同意する必要がある。&lt;/p&gt;
&lt;p&gt;debパッケージの他にrpmパッケージとデバイス・ドライバーのソース・コードとインストール方法などが記されたPDFファイルも用意されている。アーキテクチャは32ビットと64ビットのどちらも選ぶことができる。&lt;/p&gt;
&lt;p&gt;debパッケージとrpmパッケージとソース・コードはtar形式に書庫化された上でgzip形式で圧縮されている。そのため、拡張子がtar.gzとある。&lt;/p&gt;
&lt;p&gt;tar.gzファイルを伸長（解凍）するにはLinux OSではtarコマンドを利用することができる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ tar -xzvf iscan-gt-s600-bundle-2.30.4.x64.deb.tar&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;tarコマンドのオプションについて説明すると、-xは書庫からファイルを取り出すための--extractか--getを意味し、-zはgzip形式の圧縮ファイルを伸長するための--gzipか--gunzipか--ungzipを意味し、-vは処理されたファイルを詳細にリストするための--verboseを意味する。&lt;/p&gt;
&lt;p&gt;圧縮された書庫ファイルが伸長されて中のファイルが取り出されるとそのファイル名からtar.gzを覗いた名前のディレクトリー（フォルダー）が出力される。そのディレクトリーの中にinstall.shというシェル・スクリプトのファイルがあるので、これを実行するとインストールが開始される。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ su
# ./install.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;しかし、Debian GNU/Linux 13 (trixie)では依存関係にあるlibsaneが見つからず、次のようなエラー・メッセージを吐いてインストールに失敗してしまった。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;E: Unable to locate package libsane&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;この問題の原因はどうやらライブラリーの1つであるかつてのlibsaneが現在ではlibsane1へと変更されたことにあるようだ。Debian 12 (bookworm)までは移行用のdebパッケージとしてlibsaneが残っていたが、Debian 13からは公式のリポジトリには存在していない。&lt;/p&gt;
&lt;p&gt;シェル・スクリプトのインストーラーに頼らず、debパッケージをdpkgコマンドを利用して直接インストールすることにした。3つのdebパッケージをそれぞれインストールする必要があり、それらは次のような順番でインストールする必要がある。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# dpkg -i iscan-data_1.39.2-1_all.deb
# dpkg -i iscan_2.30.4-2_amd64.deb
# dpkg -i iscan-plugin-gt-s600_2.1.3-1_amd64.deb&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2つめのdebパッケージのインストールでやはり同じエラーが生じてしまった。そこで、依存関係を無視させて強制的にインストールする--force-dependsオプションを付けてインストールしてみた。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;# dpkg -i --force-depends iscan_2.30.4-2_amd64.deb&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これでデバイス・ドライバーはインストールされ、エプソンのスキャナーをLinux OSが認識してくれるようになった。&lt;/p&gt;
&lt;p&gt;ところがその結果、壊れたパッケージがあるとAPTが警告してくるようになった。Debianのマニュアルによれば--force-dependsを使うことは極力避けるべき乱暴な手段であるようだ。パッケージ管理システムのデータベースに不整合が生じてしまったら面倒なことになる。&lt;/p&gt;
&lt;p&gt;この問題を回避する他の方法があるのか、インターネット上を探してみた。いくつか見つかったが、それらの多くもやや離れ業のように思われた。&lt;/p&gt;
&lt;p&gt;見つかった解決法の中でもっとも合理的で正当だと思われたのがdebパッケージを再編集してビルドし直すこと。その方法に挑戦してみたらうまく行ったので、この投稿ではその手順を示したいと思う。&lt;/p&gt;
&lt;p&gt;ここでやることは、dpkg-debと呼ばれているDebianパッケージ・アーカイブの操作ツールを使い、問題のあるiscan_2.30.4-2_amd64.debというdebパッケージから中身を取り出し、依存関係に関する設定を修正した上でdpkgコマンドを使ってdebパッケージを再構築すること。これはそれほど難しくなかった。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ターミナル・エミュレーターを起動してcdコマンドでiscan_2.30.4-2_amd64.debがあるディレクトリに移動する。&lt;/li&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ cd iscan-gt-s600-bundle-2.30.4.x64.deb/core&lt;/code&gt;&lt;/pre&gt;
&lt;li&gt;dpkg-debコマンドに-Rというオプションを付けてdebパッケージ名と任意の名前の作業ディレクトリー名を引数として渡してそのdebパッケージの中身を取り出す。
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ dpkg-deb -R iscan_2.30.4-2_amd64.deb debtemp&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;debtempディレクトリー下のDEBIANディレクトリー内にcontrolというテキスト・ファイルがあるはずなので、そのディレクトリーに移動し、編集するためにテキスト・エディター（nanoやvimやMousepadなど）でそのテキスト・ファイルを開く。
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ cd debtemp/DEBIAN
nano control&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Depends:という項目の中にlibsaneが見つかったら、その名前をlibsane1に書き換える。書き換えたら保存してテキスト・エディターを終了する。
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;Depends:（中略）, libsane1 (&gt;= 1.0.11-3),...&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;元のディレクトリに戻る。
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;cd ../..&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;dpkg-debコマンドに-bというオプションを付け、作業ディレクトリdebtempとiscan_2.30.4-2_amd64.debを引数として渡して実行し、debパッケージを再構築する。&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ dpkg-deb -b debtemp iscan_2.30.4-2_amd64.deb
dpkg-deb: building package &#39;iscan&#39; in &#39;iscan_2.30.4-2_amd64.deb&#39;.&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;debtempディレクトリーとそれ以下を丸ごと削除するために-rオプションを付けてrmコマンドを実行する。
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ rm -r debtemp&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;coreディレクトリーの上のディレクトリーに移動し、suコマンドでスーパーユーザー権限を得るかsudoコマンドとともにシェル・スクリプトのinstall.shを実行し、デバイス・ドライバーをインストールする。
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ cd ..
$ su
# ./install.sh&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;作業ディレクトリーとして作ったdebtempを削除しておかないとinstall.shがうまく機能しないことに要注意。&lt;/p&gt;
&lt;p&gt;デバイス・ドライバーのインストールが無事に完了したら、スキャナーがパソコンに接続されて電源が入っている状態でXSaneを起動する。インストールに成功していればスキャナーが検出されてXSaneが起動するはず。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/311061643719354674/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2025/01/debian-13epson-gt-s600.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/311061643719354674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/311061643719354674'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2025/01/debian-13epson-gt-s600.html' title='Debian 13へのEPSON GT-S600のデバイスドライバのインストールに失敗'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-3909773751775210898</id><published>2024-09-27T23:48:00.007+09:00</published><updated>2026-03-05T11:32:24.963+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Debian GNU/Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Debian trixie"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="MetaTrader"/><category scheme="http://www.blogger.com/atom/ns#" term="Wine"/><title type='text'>Debian 13にMetaTrader 5をインストールしてみた</title><content type='html'>&lt;dl&gt;
&lt;dt&gt;インストール対象&lt;/dt&gt;
&lt;dd&gt;Debian GNU/Linux 13 Trixie 64ビット版&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;インストールするアプリ&lt;/dt&gt;
&lt;dd&gt;MetaTrader 5&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;FXや株式のトレーダー向けに最適化された取引プラットフォームの1つにMetaTraderという名のソフトウェアがある。&lt;/p&gt;
&lt;p&gt;MetaTrader 5のWindows版は&lt;a href=&quot;https://www.metaquotes.net/&quot;&gt;MetaQuotes&lt;/a&gt;からダウンロードして無料で利用できる。Linux OS版は用意されていないが、&lt;a href=&quot;https://www.winehq.org/&quot;&gt;Wine&lt;/a&gt;を利用するとWindows版のMetaTrader 5をLinux OSにインストールして使うことができるらしい。&lt;/p&gt;
&lt;p&gt;DebianとUbuntuにはシェル・スクリプトでできた&lt;a href=&quot;https://www.mql5.com/en/articles/625?utm_source=www.metaquotes.net&amp;utm_campaign=download.mt5.linux&quot;&gt;インストーラー&lt;/a&gt;が用意されている。&lt;/p&gt;
&lt;p&gt;Debian向けのインストーラーを利用してMetaTrader 5をDebian 13にインストールしてみることにした。&lt;/p&gt;
&lt;p&gt;このインストーラーを利用するにはDebianにwgetとsudoと&lt;a href=&quot;https://www.winehq.org/&quot;&gt;Wine&lt;/a&gt;が予めインストールされている必要がある。そしてsudoの設定ファイル/etc/sudoersにはログイン中のユーザー権限の指定が例えば次のように記述されている必要がある。&lt;/p&gt;
&lt;pre class=&quot;format&quot;&gt;&lt;code&gt;ユーザー名    ALL=(ALL) ALL&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Debianの場合、次のコマンドを実行すればMetaTrader 5がインストールされる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ wget https://download.mql5.com/cdn/web/metaquotes.software.corp/mt5/mt5debian.sh ; chmod +x mt5debian.sh ; ./mt5debian.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;wgetでdownload.mql5.comというサイトからmt5debian.shというインストーラーをダウンロードし、chmodというコマンドを使ってそのインストーラー（シェル・スクリプト）のファイルに実行権を与え、そして実行する。&lt;/p&gt;
&lt;p&gt;Ubuntuの場合にはdebianというところをすべてubuntuにすればいい。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ wget https://download.mql5.com/cdn/web/metaquotes.software.corp/mt5/mt5ubuntu.sh ; chmod +x mt5ubuntu.sh ; ./mt5ubuntu.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;インストールの際にはsudoを利用するのでスーパーユーザー権限は必要ない。ただしインストールの途中で利用中の一般ユーザーのパスワードを求められる。&lt;/p&gt;
&lt;p&gt;インストール中には、winehq-stableが見つからないだの0除算だの、エラー・メッセージがいくつか表示されたので心配したが、MetaTrader 5のインストーラーがなんとか起動してくれた。&lt;/p&gt;
&lt;p&gt;デフォルトのインストール先はログイン中の一般ユーザーのホーム・ディレクトリ内に自動的に作られる隠しディレクトリ.mt5となる。&lt;/p&gt;
&lt;p&gt;インストールは無事に成功した模様でMetaTrader 5が起動したものの、一部は日本語がちゃんと表示されているが、メニューが□□□□のように文字化けしていた。&lt;/p&gt;
&lt;p&gt;この解決法の1つとしてWindowsから日本語フォントを借りてくる手を使った。同じパソコンにインストールしてあるWindowsのパーティションにアクセスして/Windows/Fonts内からmsjh.ttcとmsjhl.ttcというファイルをLinux OS側の.met5/drive_c/windows/Fonts内に複製した。&lt;/p&gt;
&lt;p&gt;そうしておいてMetaTrader 5を再起動。すると日本語メニューが表示されるようになった。一件落着。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/3909773751775210898/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2024/09/debian-13metatrader-5.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/3909773751775210898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/3909773751775210898'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2024/09/debian-13metatrader-5.html' title='Debian 13にMetaTrader 5をインストールしてみた'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-4299173866448120226</id><published>2022-11-13T13:16:00.006+09:00</published><updated>2026-02-04T18:31:23.582+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="数学"/><title type='text'>円周、円弧、扇の面積、円の面積、球体の表面積、球体の体積、円柱と円錐の体積</title><content type='html'>&lt;h4&gt;円周&lt;/h4&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_figure_circumference&quot; width=&quot;120&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
C &amp;amp;:= 円周 \\
r &amp;amp;:= 円の半径 \\
\pi &amp;amp;:= 円周率 \\
\pi &amp;amp;= 3.141593... \\
C &amp;amp;= 2 \pi r \\
&amp;amp;= 2 \times 3.141593... \times r
\end{align*}&lt;/div&gt;
&lt;p&gt;&lt;ruby&gt;&lt;rb&gt;円周&lt;/rb&gt;&lt;rt&gt;えんしゅう&lt;/rt&gt;&lt;/ruby&gt;とは円の周りの長さのこと。英語では円周のことをcircumference（サーカムフレンス）と呼んでいる。-cum-に発音上の強勢がある。&lt;/p&gt;
&lt;p&gt;円の&lt;ruby&gt;&lt;rb&gt;半径&lt;/rb&gt;&lt;rt&gt;はんけい&lt;/rt&gt;&lt;/ruby&gt;は円の中心から周りまでの長さのこと。英語では円の半径のことをradius（レイディアス）と呼んでいる。&lt;/p&gt;
&lt;p&gt;円の半径は円の直径の半分。半径をrとし、直径(diameter)をdとすると、\( r = \dfrac{d}{2} \)と表わすことができる。&lt;/p&gt;
&lt;p&gt;円ではその半径がどこを測っても等しい。&lt;/p&gt;
&lt;p&gt;&lt;ruby&gt;&lt;rb&gt;円周率&lt;/rb&gt;&lt;rt&gt;えんしゅうりつ&lt;/rt&gt;&lt;/ruby&gt;はギリシア文字の\( \Pi \)（ピ）の小文字である\( \pi \)を用いて表され、英語式にパイと呼ぶ慣わしがある。&lt;/p&gt;
&lt;p&gt;円周率は数学定数と呼ばれている定まった数。ただしそれを10進法で表わすと3.141593...のように無限に続く可能性がある。円の直径(diameter)をdとし、円周をCとすると、円周率\( \pi = \dfrac{C}{d} \)と定義されている。&lt;/p&gt;
&lt;p&gt;円周率は分数の形では表わすことができないことが分かっているために&lt;ruby&gt;&lt;rb&gt;無理数&lt;/rb&gt;&lt;rt&gt;むりすう&lt;/rt&gt;&lt;/ruby&gt;として知られている。円周率は代数的な数として表わすことができないことが分かっているために&lt;ruby&gt;&lt;rb&gt;超越数&lt;/rb&gt;&lt;rt&gt;ちょうえつすう&lt;/rt&gt;&lt;/ruby&gt;にも分類されている。&lt;/p&gt;
&lt;h4&gt;円弧&lt;/h4&gt;
&lt;p&gt;&lt;ruby&gt;&lt;rb&gt;円弧&lt;/rb&gt;&lt;rt&gt;えんこ&lt;/rt&gt;&lt;/ruby&gt;は円周の任意の部分、したがって円周の一部、言い換えれば円の断片を指す。閉じていない円周とも開いた円周とも見なすことができる。&lt;/p&gt;
&lt;p&gt;単に&lt;ruby&gt;&lt;rb&gt;弧&lt;/rb&gt;&lt;rt&gt;こ&lt;/rt&gt;&lt;/ruby&gt;と呼んだ場合には円の一部ではなく、任意の2点間を結ぶ曲線一般のことを指している。&lt;/p&gt;
&lt;p&gt;英語では円弧も単なる弧もこのどちらもan arc（アーク）と呼ばれている。特に円弧を表す場合にはthe arc of a circleのように言うことができる。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_figure_arc&quot; width=&quot;120&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;円弧は円の中心から任意に伸びた半直線によって切断された円周の一部として定義でき、その半径と&lt;ruby&gt;&lt;rb&gt;中心角&lt;/rb&gt;&lt;rt&gt;ちゅうしんかう&lt;/rt&gt;&lt;/ruby&gt;によってその大きさを求めることができる。&lt;/p&gt;
&lt;p&gt;円弧の長さ(the arc length)は次のような関係式によって計算できる。ただし&lt;ruby&gt;&lt;rb&gt;中心角&lt;/rb&gt;&lt;rt&gt;ちゅうしんかく&lt;/rt&gt;&lt;/ruby&gt;の大きさが&lt;ruby&gt;&lt;rb&gt;弧度法&lt;/rb&gt;&lt;rt&gt;こどほう&lt;/rt&gt;&lt;/ruby&gt;によって測られることに要注意。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
L &amp;amp;:= 円弧 \\
r &amp;amp;:= 半径 \\
\theta &amp;amp;:= 中心角の大きさ（ラジアン） \\
L &amp;amp;= r\theta \end{align*}&lt;/div&gt;
&lt;p&gt;&lt;ruby&gt;&lt;rb&gt;度数法&lt;/rb&gt;&lt;rt&gt;どすうほう&lt;/rt&gt;&lt;/ruby&gt;を弧度法に直すには度数法の値を\( \dfrac{\pi}{180} \)倍する。&lt;/p&gt;
&lt;p&gt;度数法による中心角θで円弧を計算する場合には次のような関係式を用いることができる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
\theta &amp;amp;:= 中心角の大きさ（度数法） \\
L &amp;amp;= \theta \times \dfrac{\pi}{180} \times r \\
&amp;amp;= \dfrac{\pi}{180}r\theta \end{align*}&lt;/div&gt;
&lt;h4&gt;&lt;ruby&gt;&lt;rb&gt;扇形&lt;/rb&gt;&lt;rt&gt;おうぎがた&lt;/rt&gt;&lt;/ruby&gt;の面積&lt;/h4&gt;
&lt;p&gt;扇形は英語ではa circular sectorやa circle sectorやthe sector of a circleなどと呼ばれている。扇形の面積は英語でthe area of a circular sectorなどと言うことができる。&lt;/p&gt;
&lt;p&gt;扇形の面積は円の中心から放射状に外に伸びる半直線に挟まれた円弧によって閉じられた平面領域を指している。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_figure_circularSector&quot; width=&quot;120&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;扇形の面積は次の関係式によって計算することができる。ただし中心角はラジアンでなくてはならない。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
A &amp;amp;:= 扇形の面積 \\
\theta &amp;amp;:= 中心角の大きさ（ラジアン） \\
\pi &amp;amp;:= 3.14159265...（円周率） \\
r &amp;amp;:= 半径 \\
A &amp;amp;= \dfrac{\theta}{2\pi} \pi r^2 \\
&amp;amp;= \dfrac{\theta}{2}r^2 \end{align*}&lt;/div&gt;
&lt;p&gt;度数法をラジアン（弧度法）に変換するには度数法の値を\( \dfrac{\pi}{180} \)倍する。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
\theta &amp;amp;:= 中心角の大きさ（度数法） \\
A &amp;amp;= \dfrac{\dfrac{\pi}{180}\theta}{2}r^2 \\
&amp;amp;= \dfrac{\pi}{180}\theta \times \dfrac{1}{2}r^2 \\
&amp;amp;= \dfrac{\pi}{180 \times 2}\theta r^2 \\
&amp;amp;= \dfrac{\pi}{360}\theta r^2
\end{align*}&lt;/div&gt;
&lt;h4&gt;円の面積&lt;/h4&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_figure_areaOfCircle&quot; width=&quot;120&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
A_{ci} &amp;amp;:= 円の面積 \\
r &amp;amp;:= 円の半径 \\
\pi &amp;amp;:= 円周率 \\
\pi &amp;amp;= 3.141593... \\
A_{ci} &amp;amp;= \pi r^2 \\
&amp;amp;= 3.141593... \times (r \times r)
\end{align*}&lt;/div&gt;
&lt;p&gt;円の面積は英語ではarea of a circleと呼ばれている。&lt;/p&gt;
&lt;p&gt;公式を見ると、円の面積は、一辺がr（円の半径）の長さを持つ正方形の面積の円周率(3.141593...)倍であることが分かる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A_{ci} = 3.141593... \times 一辺がrの正方形の面積 \]&lt;/div&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_figure_areaOfCircle2&quot; width=&quot;120&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;h4&gt;球体の表面積（球面積）&lt;/h4&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_figure_sphere&quot; width=&quot;120&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
SA_{sp} &amp;amp;:= 球体の表面積 \\
r &amp;amp;:= 球体の半径 \\
\pi &amp;amp;:= 円周率 \\
\pi &amp;amp;= 3.141593... \\
SA_{sp} &amp;amp;= 4 \pi r^2 \\
&amp;amp;= 4 \times 3.141593... \times (r \times r)
\end{align*}&lt;/div&gt;
&lt;p&gt;球体の&lt;ruby&gt;&lt;rb&gt;表面積&lt;/rb&gt;&lt;rt&gt;ひょうめんせき&lt;/rt&gt;&lt;/ruby&gt;は英語ではsurface area of a sphereと呼ばれている。&lt;/p&gt;
&lt;p&gt;球体の半径とは球体の中心から表面までの長さ。球体ではその半径がどこを測っても等しい。&lt;/p&gt;
&lt;p&gt;公式を見ると、球体の表面積は、その球体の中心部を通るように真っ二つに切断したときの断面の面積（円の面積）の4倍であることが分かる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ 球体の表面積 = 4 \times 同じ半径を持つ円の面積 \]&lt;/div&gt;
&lt;p&gt;球体の表面積はそれと外側に接する円柱の上下の円を取り除いた側面だけの表面積、つまり長方形の面積と等しい。要するに、この円柱の高さは球体の半径の2倍なので\( 2r \)となり、円柱の長さは球体の円周になるので\( 2 \pi r \)となる。よってこの円柱の側面の広さは次のようになり、球体の表面積と同じ式で計算することができる。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_cylinder_side&quot; width=&quot;120&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
円柱の側面の面積 &amp;amp;= 2r \times 2 \pi r \\
&amp;amp;= 2^2 \pi r^2 \\
&amp;amp;= 4 \pi r^2 \\
&amp;amp;= 4 \times 3.141593... \times (r \times r) \\
&amp;amp;= 球体の表面積
\end{align*}&lt;/div&gt;
&lt;h4&gt;球体の体積&lt;/h4&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_figure_volumeOfSphere&quot; width=&quot;120&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
V_{sp} &amp;amp;:= 球体の体積 \\
r &amp;amp;:= 球体の半径 \\
\pi &amp;amp;:= 円周率 \\
\pi &amp;amp;= 3.141593... \\
V_{sp} &amp;amp;= \dfrac{4}{3} \pi r^3 \\
&amp;amp;= \dfrac{4 \times 3.141793...}{3} \times (r \times r \times r) \\
&amp;amp;= \dfrac{4 \times (r \times r \times r)}{3} \times 3.141593... \\
&amp;amp;= 1.333333... \times 3.141593... \times (r \times r \times r)
\end{align*}&lt;/div&gt;
&lt;p&gt;球体の&lt;ruby&gt;&lt;rb&gt;体積&lt;/rb&gt;&lt;rt&gt;たいせき&lt;/rt&gt;&lt;/ruby&gt;は英語ではvolume of a sphereと呼ばれている。&lt;/p&gt;
&lt;p&gt;面積では半径の2&lt;ruby&gt;&lt;rb&gt;乗&lt;/rb&gt;&lt;rt&gt;じょう&lt;/rt&gt;&lt;/ruby&gt;であったのに対して体積では半径が3乗になっているのが分かる。半径の2乗に立体の奥行きが加わって3乗になった。&lt;/p&gt;
&lt;p&gt;4分の3は小数として表わすと1.33333...になる。掛け算の&lt;ruby&gt;&lt;rb&gt;単位元&lt;/rb&gt;&lt;rt&gt;たんいげん&lt;/rt&gt;&lt;/ruby&gt;1に加えて小数点以下に3が繰り返す&lt;ruby&gt;&lt;rb&gt;循環&lt;/rb&gt;&lt;rt&gt;じゅんかん&lt;/rt&gt;&lt;/ruby&gt;小数。&lt;/p&gt;
&lt;p&gt;球体の体積はその外側にぴったりと接する&lt;ruby&gt;&lt;rb&gt;円柱&lt;/rb&gt;&lt;rt&gt;えんちゅう&lt;/rt&gt;&lt;/ruby&gt;の体積の3分の2であることが知られている。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_figure_cylinderAndSphere&quot; width=&quot;120&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
V_{sp} &amp;amp;:= 球体の体積 \\
V_{cy} &amp;amp;:= 円柱の体積 \\
V_{sp} &amp;amp;= \dfrac{2}{3}V_{cy} \\
&amp;amp;= 0.66666... \times V_{cy}
\end{align*}&lt;/div&gt;
&lt;p&gt;円柱は英語ではcylinderと呼ばれている。日本語読みをすればシリンダー。&lt;/p&gt;
&lt;p&gt;3分の2を小数に直すと0.66666...という循環小数になる。&lt;/p&gt;
&lt;h4&gt;円柱の体積&lt;/h4&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_figure_volumeOfCylinder&quot; width=&quot;120&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;円柱の体積は次の式によって得ることができる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
V_{cy} &amp;amp;:= 円柱の体積 \\
h &amp;amp;:= 円柱の高さ \\
r &amp;amp;:= 円柱の半径 \\
円周率 &amp;amp;:= \pi \\
\pi &amp;amp;= 3.141593... \\
V_{cy} &amp;amp;= \pi r^2 h \\
&amp;amp;= 3.141593... \times (r \times r) \times h \\
\end{align*}&lt;/div&gt;
&lt;p&gt;ちなみに、&lt;ruby&gt;&lt;rb&gt;円錐&lt;/rb&gt;&lt;rt&gt;えんすい&lt;/rt&gt;&lt;/ruby&gt;の体積はその外側にぴったりと接する円柱の体積の3分の1であることが知られている。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_figure_volumeOfCone&quot; width=&quot;120&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;そしてこれらのことから次のことが明らかになる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
V_{cy}&amp;amp;:= 円柱の体積 \\
h_{cy} &amp;amp;:= 円柱の高さ \\
V_{sp} &amp;amp;:= 球体の体積 \\
r_{sp} &amp;amp;:= 球体の半径 \\
V_{co} &amp;amp;:= 円錐の体積 \\
h_{co} &amp;amp;:= 円錐の高さ \\
h_{cy} &amp;amp;= h_{co} = r_{ci}^2 \\
V_{cy} &amp;amp;= \pi r^2 h = 2 \pi r^3 \\ 
V_{cy} &amp;amp;= V_{sp} + V_{co} \\
2 \pi r^3 &amp;amp;= \dfrac{4}{3}\pi r^3 + 2 \times \dfrac{1}{3}\pi r^3 \\
&amp;amp;= \dfrac{4}{3}\pi r^3 + \dfrac{2}{3}\pi r^3
\end{align*}&lt;/div&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;canvas_figure_relationshipOfVolumes&quot; width=&quot;400&quot; height=&quot;120&quot;&gt;
あなたのブラウザはCanvas要素に対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;円柱の体積は、その円柱の内側にぴったりと接する円錐の体積と、その円柱の内側にぴったりと接する球体の体積との合計。円柱の内側にぴったりと接する円錐とは、その底辺の円の半径が円柱のそれと同じで、かつ、その高さも円柱と同じもの。円柱の内側にぴったりと接する球体とは、その球体の半径が円柱の半径と同じで、かつ、その球体の直径がその円柱の高さと同じもの。&lt;/p&gt;
&lt;p&gt;円柱状の鉄の固まりが一つあったとすると、それを溶かし、同じ半径と同じ高さを持つ円錐一つと、円柱の高さと同じ直径と同じ半径を持つ球体一つを作ることができる。&lt;/p&gt;
&lt;p&gt;円柱と円錐の表面積、そしてまた、楕円と（回転）楕円体についてはまたの機会に。&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
//即時実行函数式でスクリプト全体を袋とじ
(function(){

function figure_arc(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);

  //黒で円弧を描く
  context.beginPath();
  context.arc(55, 55, 50, 0*(Math.PI/180), 250*(Math.PI/180), true);
  context.lineWidth = &#39;2&#39;;
  context.strokeStyle = &#39;black&#39;;
  context.stroke();

  //で円弧を描く
  context.beginPath();
  context.arc(55, 55, 50, 250*(Math.PI/180), 360*(Math.PI/180), true);
  context.lineWidth = &#39;2&#39;;
  context.strokeStyle = &#39;grey&#39;;
  context.setLineDash([3,2]); //点線
  context.stroke();
}

function figure_circularSector(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);

  //黒で円弧を描く
  context.beginPath();
  context.moveTo(55, 55);
  context.lineTo(55+50, 55);
  context.arc(55, 55, 50, 0*(Math.PI/180), 250*(Math.PI/180), true);
  context.closePath();
  context.lineWidth = &#39;2&#39;;
  context.strokeStyle = &#39;black&#39;;
  context.stroke();
  context.fillStyle = &#39;skyblue&#39;;
  context.fill();

  //で円弧を描く
  context.beginPath();
  context.arc(55, 55, 50, 250*(Math.PI/180), 360*(Math.PI/180), true);
  context.lineWidth = &#39;2&#39;;
  context.strokeStyle = &#39;grey&#39;;
  context.setLineDash([3,2]); //点線
  context.stroke();
}

function figure_circumference(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);
  
  //黒で円を描く
  context.beginPath();
  context.arc(55, 55, 50, 0, Math.PI*2, true);
  context.closePath();
  context.lineWidth = &#39;2&#39;;
  context.strokeStyle = &#39;black&#39;;
  context.stroke();
}

function figure_areaOfCircle(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);
  
  //黒で円を描いてその面積を水色で塗りつぶす
  context.beginPath();
  context.arc(55, 55, 50, 0, Math.PI*2, true);
  context.closePath();
  context.lineWidth = &#39;2&#39;;
  context.strokeStyle = &#39;black&#39;;
  context.stroke();
  context.fillStyle = &#39;skyblue&#39;;
  context.fill();
}

function figure_areaOfCircle2(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);
  
  //黒で円を描いて水色で塗りつぶす
  context.beginPath();
  context.arc(55, 55, 50, 0, Math.PI*2, true);
  context.closePath();
  context.lineWidth = &#39;2&#39;;
  context.strokeStyle = &#39;black&#39;;
  context.stroke();
  context.fillStyle = &#39;skyblue&#39;;
  context.fill();
  
  //四角形を描いて半透明で塗りつぶす
  context.beginPath();
  context.rect(5, 5, 50, 50);
  context.closePath();
  context.lineWidth = &#39;2&#39;;
  context.strokeStyle = &#39;black&#39;;
  context.stroke();
  context.fillStyle = &#39;rgba(255,255,0,0.5)&#39;;
  context.fill();
}

function figure_sphere(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);
  
  //グラデーション
  const grd = context.createLinearGradient(0, 50, 100, 150);
  grd.addColorStop(0, &#39;blue&#39;);
  grd.addColorStop(0.5, &#39;skyblue&#39;);
  grd.addColorStop(1, &#39;white&#39;);
  
  //円を描いてグラデーションで塗りつぶす
  context.beginPath();
  context.arc(55, 55, 50, 0, Math.PI*2, true);
  context.closePath();
  context.lineWidth = &#39;2&#39;;
  context.fillStyle = grd;
  context.fill();
}

function cylinder_side(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);
  
  //グラデーション3
  const grd3 = context.createLinearGradient(10, 10, 10, 150);
  grd3.addColorStop(0, &#39;blue&#39;);
  grd3.addColorStop(0.5, &#39;skyblue&#39;);
  grd3.addColorStop(1, &#39;white&#39;);
  
  //グラデーション4
  const grd4 = context.createLinearGradient(10, 10, 10, 150);
  grd4.addColorStop(0, &#39;black&#39;);
  grd4.addColorStop(0.5, &#39;green&#39;);
  grd4.addColorStop(1, &#39;white&#39;);
  
  //円柱もどきを描いてグラデーションで塗りつぶす
  context.beginPath();
  context.moveTo(4.5, 10);
  context.lineTo(4.5, 90);
  context.lineTo(95, 90);
  context.lineTo(95, 10);
  context.fillStyle = grd3;
  context.fill();
  context.ellipse(50, 10, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.ellipse(50, 90, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.closePath();
  context.fill();
  
  //円を描いてグラデーションで塗りつぶす
  context.beginPath();
  context.arc(50, 50, 44, 0, Math.PI*2, true);
  context.closePath();
  context.lineWidth = &#39;2&#39;;
  context.fillStyle = grd4;
  context.fill();
}

function figure_volumeOfSphere(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);
  
  //グラデーション1
  const grd1 = context.createLinearGradient(0, 50, 100, 150);
  grd1.addColorStop(0, &#39;blue&#39;);
  grd1.addColorStop(0.5, &#39;skyblue&#39;);
  grd1.addColorStop(1, &#39;white&#39;);
  
  //円を描いてグラデーションで塗りつぶす
  context.beginPath();
  context.arc(55, 55, 50, 0, Math.PI*2, true);
  context.closePath();
  context.lineWidth = &#39;2&#39;;
  context.fillStyle = grd1;
  context.fill();
  
  //グラデーション2
  const grd2 = context.createLinearGradient(150, 10, 10, 150);
  grd2.addColorStop(0, &#39;black&#39;);
  grd2.addColorStop(0.5, &#39;red&#39;);
  grd2.addColorStop(1, &#39;yellow&#39;);
  
  //半々円弧を描いてグラデーションで塗りつぶす
  context.beginPath();
  context.moveTo(55, 55);
  context.arc(55, 55, 50, 0,(Math.PI)+(Math.PI/2), true);
  context.closePath();
  context.lineWidth = &#39;2&#39;;
  context.fillStyle = grd2;
  context.fill();
}

function figure_cylinderAndSphere(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);

  //グラデーション3
  const grd3 = context.createLinearGradient(10, 10, 10, 150);
  grd3.addColorStop(0, &#39;blue&#39;);
  grd3.addColorStop(0.5, &#39;skyblue&#39;);
  grd3.addColorStop(1, &#39;white&#39;);
  
  //グラデーション4
  const grd4 = context.createLinearGradient(10, 10, 10, 150);
  grd4.addColorStop(0, &#39;black&#39;);
  grd4.addColorStop(0.5, &#39;green&#39;);
  grd4.addColorStop(1, &#39;white&#39;);
  
  //円柱もどきを描いてグラデーションで塗りつぶす
  context.beginPath();
  context.moveTo(4.5, 10);
  context.lineTo(4.5, 90);
  context.lineTo(95, 90);
  context.lineTo(95, 10);
  context.fillStyle = grd3;
  context.fill();
  context.ellipse(50, 10, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.ellipse(50, 90, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.closePath();
  context.fill();
  
  //円を描いてグラデーションで塗りつぶす
  context.beginPath();
  context.arc(50, 50, 44, 0, Math.PI*2, true);
  context.closePath();
  context.lineWidth = &#39;2&#39;;
  context.fillStyle = grd4;
  context.fill();
}

function figure_volumeOfCone(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);

  //グラデーション3
  const grd3 = context.createLinearGradient(10, 10, 10, 150);
  grd3.addColorStop(0, &#39;blue&#39;);
  grd3.addColorStop(0.5, &#39;skyblue&#39;);
  grd3.addColorStop(1, &#39;white&#39;);
  
  //グラデーション4
  const grd4 = context.createLinearGradient(10, 10, 10, 150);
  grd4.addColorStop(0, &#39;black&#39;);
  grd4.addColorStop(0.5, &#39;green&#39;);
  grd4.addColorStop(1, &#39;white&#39;);
  
  //円柱もどきを描いてグラデーションで塗りつぶす
  context.beginPath();
  context.moveTo(4.5, 10);
  context.lineTo(4.5, 90);
  context.lineTo(95, 90);
  context.lineTo(95, 10);
  context.fillStyle = grd3;
  context.fill();
  context.ellipse(50, 10, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.ellipse(50, 90, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.closePath();
  context.fill();
  
  //円錐もどきを描いてグラデーションで塗りつぶす
  context.beginPath();
  context.moveTo(50, 10);
  context.lineTo(5, 90);
  context.lineTo(95, 90);
  context.lineTo(50, 10);
  context.fillStyle = grd4;
  context.fill();
  context.ellipse(50, 90, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.closePath(); 
  context.fill();
}

function figure_volumeOfCylinder(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);

  //グラデーション3
  const grd3 = context.createLinearGradient(10, 10, 10, 150);
  grd3.addColorStop(0, &#39;blue&#39;);
  grd3.addColorStop(0.5, &#39;skyblue&#39;);
  grd3.addColorStop(1, &#39;white&#39;);
  
  //円柱もどきを描いてグラデーションで塗りつぶす
  context.beginPath();
  context.moveTo(4.5, 10);
  context.lineTo(4.5, 90);
  context.lineTo(95, 90);
  context.lineTo(95, 10);
  context.fillStyle = grd3;
  context.fill();
  context.ellipse(50, 10, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.ellipse(50, 90, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.closePath();
  context.fill();
}

function figure_relationshipOfVolumes(canvasId){
  const canvas = document.getElementById(canvasId);
  const context = canvas.getContext(&quot;2d&quot;);

  //グラデーション3
  const grd3 = context.createLinearGradient(10, 10, 10, 150);
  grd3.addColorStop(0, &#39;blue&#39;);
  grd3.addColorStop(0.5, &#39;skyblue&#39;);
  grd3.addColorStop(1, &#39;white&#39;);
  
  //グラデーション4
  const grd4 = context.createLinearGradient(10, 10, 10, 150);
  grd4.addColorStop(0, &#39;black&#39;);
  grd4.addColorStop(0.5, &#39;green&#39;);
  grd4.addColorStop(1, &#39;white&#39;);
  
  //円柱もどきを描いてグラデーションで塗りつぶす
  context.beginPath();
  context.moveTo(4.5, 10);
  context.lineTo(4.5, 90);
  context.lineTo(95, 90);
  context.lineTo(95, 10);
  context.fillStyle = grd3;
  context.fill();
  context.ellipse(50, 10, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.ellipse(50, 90, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.closePath();
  context.fill();
  
  //座標変数
  const x1 = 150;
  const x2 = 300;
  
  //円を描いてグラデーションで塗りつぶす
  context.beginPath();
  context.arc(50+x1, 50, 44, 0, Math.PI*2, true);
  context.closePath();
  context.lineWidth = &#39;2&#39;;
  context.fillStyle = grd4;
  context.fill();
  
  //円錐もどきを描いてグラデーションで塗りつぶす
  context.beginPath();
  context.moveTo(50+x2, 10);
  context.lineTo(5+x2, 90);
  context.lineTo(95+x2, 90);
  context.lineTo(50+x2, 10);
  context.fillStyle = grd4;
  context.fill();
  context.ellipse(50+x2, 90, 10, 45, Math.PI/2, 0, 2*Math.PI);
  context.closePath(); 
  context.fill();
  
  //文字を描く
  context.font = &#39;bold 50px &quot;ＭＳ Ｐ明朝&quot;, sans-serif&#39;;
  context.textAlign = &#39;start&#39;;
  context.textBaseline = &#39;middle&#39;;
  context.fillStyle = &#39;black&#39;;
  context.fillText(&quot;=&quot;, 105, 50, 50);
  context.fillText(&quot;+&quot;, 255, 50, 50);
}

figure_circumference(&quot;canvas_figure_circumference&quot;);
figure_arc(&quot;canvas_figure_arc&quot;);
figure_circularSector(&quot;canvas_figure_circularSector&quot;);
figure_areaOfCircle(&quot;canvas_figure_areaOfCircle&quot;);
figure_areaOfCircle2(&quot;canvas_figure_areaOfCircle2&quot;);
figure_sphere(&quot;canvas_figure_sphere&quot;);
cylinder_side(&quot;canvas_cylinder_side&quot;);
figure_volumeOfSphere(&quot;canvas_figure_volumeOfSphere&quot;);
figure_cylinderAndSphere(&quot;canvas_figure_cylinderAndSphere&quot;);
figure_volumeOfCylinder(&quot;canvas_figure_volumeOfCylinder&quot;);
figure_volumeOfCone(&quot;canvas_figure_volumeOfCone&quot;);
figure_relationshipOfVolumes(&quot;canvas_figure_relationshipOfVolumes&quot;);

})(); //即時実行函数式の終わり
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/4299173866448120226/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2022/11/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/4299173866448120226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/4299173866448120226'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2022/11/blog-post.html' title='円周、円弧、扇の面積、円の面積、球体の表面積、球体の体積、円柱と円錐の体積'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-4695356769727712301</id><published>2022-09-20T11:05:00.020+09:00</published><updated>2026-02-07T02:51:12.416+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GNU Octave"/><category scheme="http://www.blogger.com/atom/ns#" term="Julia"/><category scheme="http://www.blogger.com/atom/ns#" term="Maxima"/><category scheme="http://www.blogger.com/atom/ns#" term="Python3"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><category scheme="http://www.blogger.com/atom/ns#" term="R言語"/><category scheme="http://www.blogger.com/atom/ns#" term="数学"/><title type='text'>角度とそれを測る単位系（度数法や弧度法等）を理解する</title><content type='html'>&lt;h4&gt;角度&lt;/h4&gt;
&lt;p&gt;平面上の角度は時計の針のようにモデル化することができる。つまり、1つの回転軸を共有する2本の半直線の回転量の差として表せる。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;angleModel20220610a&quot; width=&quot;150&quot; height=&quot;150&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;angleModel20220610b&quot; width=&quot;150&quot; height=&quot;150&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;半直線は矢印の方向に無限に伸びる光線のようなイメージ。この2本の半直線は角度のアームと呼ばれることがある。&lt;/p&gt;
&lt;p&gt;2本のアームの回転軸は頂点と呼ばれている。頂点はOやPやQなどの文字で表されることが多い。&lt;/p&gt;
&lt;p&gt;角度それ自身は&lt;ruby&gt;&lt;rb&gt;\( \theta \)&lt;/rb&gt;&lt;rt&gt;スモールシータ&lt;/rt&gt;&lt;/ruby&gt;や&lt;ruby&gt;&lt;rb&gt;\( \varphi \)&lt;/rb&gt;&lt;rt&gt;スモールファイ&lt;/rt&gt;&lt;/ruby&gt;もしくは&lt;ruby&gt;&lt;rb&gt;\( \alpha \)&lt;/rb&gt;&lt;rt&gt;スモールアルファ&lt;/rt&gt;&lt;/ruby&gt;や&lt;ruby&gt;&lt;rb&gt;\( \beta \)&lt;/rb&gt;&lt;rt&gt;スモールベータ&lt;/rt&gt;&lt;/ruby&gt;といったギリシア文字で表されることが多い。スモールシータは数学でよく用いられており、スモールファイは工学でよく用いられる。&lt;/p&gt;
&lt;p&gt;ちなみに、3次元の極座標系の1つである球面座標系では極角（緯度）がスモールシータで、方位角（経度）がスモールファイで表されていることが多い。&lt;/p&gt;
&lt;p&gt;角度を記号によって表すには角を表す\( \angle ABC \)の前にmeasureのmを添えて\( m \angle ABC \)と記すことができる。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;geometricModelOfAngle20220610&quot; width=&quot;150&quot; height=&quot;110&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;角度が度数法で0°から90°の範囲にあるとき、その角度は&lt;ruby&gt;&lt;rb&gt;鋭角&lt;/rb&gt;&lt;rt&gt;えいかく&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。角度が度数法で90°から180°の範囲にあるとき、その角度は&lt;ruby&gt;&lt;rb&gt;鈍角&lt;/rb&gt;&lt;rt&gt;どんかく&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。&lt;/p&gt;
&lt;p&gt;下の図では青が鋭角、赤が鈍角。下の図では青い角と赤い角は互いに&lt;ruby&gt;&lt;rb&gt;補角&lt;/rb&gt;&lt;rt&gt;ほかく&lt;/rt&gt;&lt;/ruby&gt;の関係にもある。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;acuteAndObtuseAngle20220610&quot; width=&quot;200&quot; height=&quot;110&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;2つの角度の合計が180°のとき、それらの角度は互いに補角の関係にある。英語ではsupplementary anglesと呼ばれている。2つの角度の合計が90°であるとき、それらの角度は互いに&lt;ruby&gt;&lt;rb&gt;余角&lt;/rb&gt;&lt;rt&gt;よかく&lt;/rt&gt;&lt;/ruby&gt;の関係にある。英語ではcomplementary anglesと呼ばれている。したがって上の図が補角(a supplementary angle)で下の図が余角(a complementary angle)の関係を表している。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;supplementaryAngle20220610&quot; width=&quot;110&quot; height=&quot;110&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;頂点を共有して対称関係にある反対側の角は&lt;ruby&gt;&lt;rb&gt;対頂角&lt;/rb&gt;&lt;rt&gt;たいちょうかく&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。対頂角の角度は等しい。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;verticallyOppositeAngle20220610&quot; width=&quot;210&quot; height=&quot;210&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
\[ \alpha = \beta \]
\[ \theta = \varphi \]
&lt;/div&gt;
&lt;p&gt;また、頂点を共有する隣同士の角は線形ペアと呼ばれることがある。上の図で言えば次のペアが線形ペア。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ (\alpha,\theta) \]
\[ (\alpha,\varphi) \]
\[ (\beta,\theta) \]
\[ (\beta,\varphi) \]&lt;/div&gt;
&lt;p&gt;2本のアーム（半直線）が水平または垂直に連なり、角度が180°であるとき、その角度は特に&lt;ruby&gt;&lt;rb&gt;平角&lt;/rb&gt;&lt;rt&gt;へいかく&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;straightAngle20220610&quot; width=&quot;200&quot; height=&quot;50&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;角度のアームが右に水平、言い換えると時計で言うところの3時（15時）の時点にあるとき、それを標準位置と呼ぶことがある。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;standardPosition20220610&quot; width=&quot;110&quot; height=&quot;20&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;その標準位置が角度のちょうど0に当たる。&lt;/p&gt;
&lt;p&gt;平面の角度を計測するための物差し、つまり角度の&lt;ruby&gt;&lt;rb&gt;単位系&lt;/rb&gt;&lt;rt&gt;たんいけい&lt;/rt&gt;&lt;/ruby&gt;にはいくつかある。ここでは&lt;ruby&gt;&lt;rb&gt;度数法&lt;/rb&gt;&lt;rt&gt;どすうほう&lt;/rt&gt;&lt;/ruby&gt;と&lt;ruby&gt;&lt;rb&gt;弧度法&lt;/rb&gt;&lt;rt&gt;こどほう&lt;/rt&gt;&lt;/ruby&gt;と回転法とに言及する。&lt;/p&gt;
&lt;h4&gt;度数法&lt;/h4&gt;
&lt;p&gt;一般に馴染みのある度数法では\( \dfrac{1}{4} \)回転で90°、\( \dfrac{1}{2} \)回転で180°、\( \dfrac{3}{4} \)回転で270°、1回転すると360°になり、0°に戻ってくる。&lt;/p&gt;
&lt;p&gt;水平の角度を時計のように幾何学的なモデルにすると次のように描くことができるかもしれない。目盛りは度数法に従っている。0°は時計の3時（15時）を指す標準位置に定めてある。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;circlarCoordinate20220610a&quot; height=&quot;330&quot; width=&quot;330&quot;&gt;
このブラウザではHTML5 Canvasが動作しません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;度数法は古代の天文学に基づいているという説がある。360度は地球の公転周期のおよそ365日に近い。&lt;a href=&quot;https://en.wikipedia.org/wiki/Degree_(angle)&quot;&gt;Wikipedia&lt;/a&gt;によれば、古代のバビロニア暦やペルシア暦では1年を360日と見なしていたらしい。&lt;/p&gt;
&lt;p&gt;ちなみに、地球の公転周期はより正しくは365.242199日。&lt;/p&gt;
&lt;p&gt;10進法が人の両手の指の標準的な数の合計に由来するように、度数法は地球の公転周期に由来する。&lt;/p&gt;
&lt;p&gt;
同じくWikipediaによれば、古代バビロニア人は数のシステムとして60進法を用いていた。更に正三角形で円を分割し、正三角形の内角を60進法で分割することで60分の1を角度1（すなわち1°）と見なしていたとする説もあるらしい。&lt;/p&gt;
&lt;p&gt;つまり、1角を60とする正三角形を6つ組み合わせると角度は1周し、\( 60 \times 6 = 360 \)になる。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;regularHexagon20220610&quot; height=&quot;220&quot; width=&quot;220&quot;&gt;
このブラウザではHTML5 Canvasが動作しません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;正三角形と60進法の考え方を使うと、正三角形の内角を1°と見なし、それが3つで半回転することになり、それを3°と見なせたし、それが6つで1回転して6°と見なすことができたかもしれない。そうすると次に挙げる弧度法に近い角度の値になっていた。&lt;/p&gt;
&lt;p&gt;この考え方に基づくと、1周を6等分し、その1角を60進法に従って60等分し、その60分の1を更に60等分する。それが度数法であると見なすことができる。&lt;/p&gt;
&lt;p&gt;しかし実際の度数法は1回転で360°なので、正凸360角形であると考えることができるかもしれない。&lt;/p&gt;
&lt;p&gt;正凸360角形をコンピューター・グラーフィクスによって描いてみた。それが次の図形。ディスプレイの解像度によるだろうけれども、この図形の大きさだと人の視覚では円とほとんど等しく見える。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;360regularConvexPolygon20220610&quot; height=&quot;510&quot; width=&quot;510&quot;&gt;
このブラウザではHTML5 Canvasが動作しません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;form style=&quot;text-align: center;&quot;&gt;
&lt;p&gt;&lt;label&gt;正凸&lt;/label&gt;
&lt;input type=&quot;number&quot; id=&quot;inp20220610&quot; value=&quot;360&quot; max=&quot;360&quot; min=&quot;3&quot;&gt;
&lt;label&gt;角形を&lt;/label&gt;
&lt;input type=&quot;button&quot; id=&quot;btn20220610&quot; value=&quot;描画&quot;&gt;&lt;/p&gt;
&lt;/form&gt;
&lt;p&gt;※3から360までの整数値をフォームに入力して描画ボタンを押すと正凸n角形が作図される。この値が50以下でないと放射状に描いた線分なしには多角形であると判別し難い。&lt;/p&gt;
&lt;p&gt;360分の1である1°よりも更に小さい値は、度数法では60進法に基づいて60分の1に分割され、&lt;ruby&gt;&lt;rb&gt;分&lt;/rb&gt;&lt;rt&gt;ふん&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。そしてそのまた更に小さい単位も60分の1に分割され、&lt;ruby&gt;&lt;rb&gt;秒&lt;/rb&gt;&lt;rt&gt;びょう&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。&lt;/p&gt;
&lt;p&gt;1°（1度）は60&amp;prime;（60分）、1°の半分は30&amp;prime;（30分）というようにプライム記号を付けて記されており、1&amp;prime;（1分）は60&amp;Prime;（60秒）、1&amp;prime;の半分は30&amp;Prime;（30秒）というようにダブル・プライム記号を付けて記されている。HTMLではこれらは特殊文字なので、プライム記号は&amp;amp;prime;と記し、ダブル・プライム記号は&amp;amp;Prime;と記す必要がある。&lt;/p&gt;
&lt;p&gt;1.5°は1°30&amp;prime;（1度30分）と等しく、3.75°は3°30&amp;prime;15&amp;Prime;（3度30分15秒）と等しい。&lt;/p&gt;
&lt;p&gt;度数法は時間の測定と似ている。時間における1周が12時間60分60秒であるのに対して角度の度数法では360度60分60秒となる。&lt;/p&gt;
&lt;p&gt;しかし角度に60進法の分や秒を用いるのはややこしくて不便であり、時間と違って現在では廃れた用法であるように思う。&lt;/p&gt;
&lt;h4&gt;弧度法（ラジアン法）&lt;/h4&gt;
&lt;p&gt;弧度法は微分積分学で重宝されている角度の測り方（単位系）。&lt;/p&gt;
&lt;p&gt;円の半径の長さrと円弧の長さaが等しいとき、その中心角の角度θを1と定めるのが弧度法の考え方。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;radianSystem20220610&quot; height=&quot;220&quot; width=&quot;220&quot;&gt;
このブラウザではHTML5 Canvasが動作しません。
&lt;/canvas&gt;
\[ (r = a) \Rightarrow \theta = 1^c \]
&lt;/div&gt;
&lt;p&gt;弧度法での角度の値は、単に数値だけが記されることが多いが、意味を明確にするために数値の後にradを添えたり数値の右肩に\( ^c \)を付けて記されることも少なくない。&lt;/p&gt;
&lt;p&gt;したがって1ラジアンは、単に1、もしくは1 rad、または\( 1^c \)のように書かれるかもしれない。&lt;/p&gt;
&lt;p&gt;弧度法ではこのように線分の長さの測定と角度の測定とを結び付けている。&lt;/p&gt;
&lt;p&gt;ちなみに、中心角の角度θと円弧の長さsと半径の長さrとの間には次の等式に示す関係がある。&lt;/p&gt;
&lt;div class=&#39;math&#39;&gt;\[ \theta = \dfrac{s}{r} \]
\[ s = r\theta \]
\[ r = \dfrac{s}{\theta} \]&lt;/div&gt;
&lt;p&gt;ただしこの式での角度θはラジアン。角度θが度数法のときにはその値に\( \dfrac{\pi}{180} \)を掛けてラジアンに直す必要がある。&lt;/p&gt;
&lt;p&gt;弧度法は自然な測定単位であり、度数法は恣意的であると言われることが多いが、正三角形の内角60°を利用した度数法の考え方では、半周の180°は内角が60°となる正三角形が3つ分なので60°を1と定めると円周率である3.1415926535897...に近くなる。1周の360°は正三角形が6つ分であるので円周率の2倍である6.283185307179586...とそれほど大きく隔たっていない。&lt;/p&gt;
&lt;p&gt;1 rad刻みの弧度法と60°刻みの度数法とを重ねて作図してみた。度数法が青い矢印、弧度法が赤い矢印。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;degreesAndRadians20220610&quot; height=&quot;220&quot; width=&quot;220&quot;&gt;
このブラウザではHTML5 Canvasが動作しません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;このように見てみると、60°は弧度法の1 rad = 57.29577951308232...に近いので、正三角形に基づいた度数法の考え方は惜しいところまで来ていた。&lt;/p&gt;
&lt;p&gt;もっとも角度の場合、半径が大きくなるほど誤差によって生ずる距離が拡がってゆくので、たとえ僅かな誤差であっても無視できなくなる。&lt;/p&gt;
&lt;p&gt;ラジアンは円の半径の長さrに対する円弧の長さaの比率（割合）であると言うこともできる。この観点は三角比と似ている。この比率を中心角の大きさとして定めるのが弧度法であるというわけだ。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \theta = \dfrac{a}{r} \]&lt;/div&gt;
&lt;p&gt;例えば円の半径の長さrが1の場合、次のような式になるから円弧の長さaがそのまま角度の値になる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \theta = \dfrac{a}{1} = a \]&lt;/div&gt;
&lt;p&gt;このため、半径1の円を用いた幾何学的モデルを考えると便利。半径が1の円は&lt;ruby&gt;&lt;rb&gt;単位円&lt;/rb&gt;&lt;rt&gt;たんいえん&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;unitCircle20220610&quot; height=&quot;220&quot; width=&quot;220&quot;&gt;
このブラウザではHTML5 Canvasが動作しません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;単位円という名称は&lt;ruby&gt;&lt;rb&gt;単位元&lt;/rb&gt;&lt;rt&gt;たんいげん&lt;/rt&gt;&lt;/ruby&gt;を連想させる。&lt;/p&gt;
&lt;p&gt;弧度法では円の半径rに対する円周の長さcの比率（割合）が円周率&amp;pi;の2倍と等しくなる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ 円周率の2倍 = \dfrac{円周}{円の半径} \]
\[ 2\pi = \dfrac{c}{r} \]&lt;/div&gt;
&lt;p&gt;円周率(&amp;pi;)とは円の直径と比べた円周の比率（割合）のこと。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ 円周率 = \dfrac{円周}{円の直径} = \dfrac{円周}{円の半径の2倍} \]
\[ \pi = \dfrac{c}{d} = \dfrac{c}{2r} \]&lt;/div&gt;
&lt;p&gt;弧度法では、30°は円周率&amp;pi;の6分の1、45°は円周率&amp;pi;の4分の1、60°は円周率&amp;pi;の3分の1、90°は円周率&amp;pi;の2分の1、120°は円周率&amp;pi;の3分の2、135°は円周率&amp;pi;の4分の3、150°は円周率&amp;pi;の6分の5、180°は円周率&amp;pi;と一致し、210°は円周率&amp;pi;の6分の7、225°は円周率&amp;pi;の4分の5、240°は円周率&amp;pi;の3分の4、270°は円周率&amp;pi;の2分の3、300°は円周率&amp;pi;の3分の5、315°は円周率&amp;pi;の4分の7、330°は円周率&amp;pi;の6分の11、360°は円周率&amp;pi;のちょうど2倍になる。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;circlarCoordinate20220610b&quot; height=&quot;330&quot; width=&quot;330&quot;&gt;
このブラウザではHTML5 Canvasが動作しません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;1 radの更に1000分の1はミリラジアンないしミルと呼ばれている。その単位の記号はmradまたはmil。1 mradは小数点が左に3桁移動するので0.001 radに当たる。&lt;/p&gt;
&lt;h4&gt;ターン法（回転法）&lt;/h4&gt;
&lt;p&gt;ターンとは英語の綴りではturnであり、日本語では一回りや一周のことを意味する。ターン法は英語でrotationと呼ばれていることもあり、回転を意味する。したがってこれを回転法と呼ぶことができるかもしれない。&lt;/p&gt;
&lt;p&gt;ターン法（回転法）の単位記号にはturnが一般的に使われているが、revolutionのrevやrotationのrot、またはrやtrが用いられていることもある。&lt;/p&gt;

&lt;p&gt;ちなみに、&amp;pi;に代わってギリシャ文字の&lt;ruby&gt;&lt;rb&gt;&amp;tau;&lt;/rb&gt;&lt;rt&gt;タウ&lt;/rt&gt;&lt;/ruby&gt;を幾何学定数の円周率として再定義しようという提案がある。この提案に倣うと円周率は3.1415926...ではなくてその倍である6.2831853...となり、ちょうど1回転(1 turn)した&lt;ruby&gt;&lt;rb&gt;回転角&lt;/rb&gt;&lt;rt&gt;かいてんかく&lt;/rt&gt;&lt;/ruby&gt;を意味することになる。したがって幾何学定数の&amp;tau;を使ってちょうど1回転した角度を1&amp;tau;と表すこともできる。&lt;/p&gt;
&lt;p&gt;ターン法では角度が1回転（1周）すると1 &lt;ruby&gt;&lt;rb&gt;turn&lt;/rb&gt;&lt;rt&gt;ターン&lt;/rt&gt;&lt;/ruby&gt;となる。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;circlarCoordinate20220610c&quot; height=&quot;330&quot; width=&quot;330&quot;&gt;
このブラウザではHTML5 Canvasが動作しません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;h4&gt;グラジアン法&lt;/h4&gt;
&lt;p&gt;角度を表す単位系としてこの他にも例えばグラジアン法(Gradians)がある。その単位記号には&lt;ruby&gt;&lt;rb&gt;gon&lt;/rb&gt;&lt;rt&gt;ゴン&lt;/rt&gt;&lt;/ruby&gt;または&lt;ruby&gt;&lt;rb&gt;\( ^g \)&lt;/rb&gt;&lt;rt&gt;グラード&lt;/rt&gt;&lt;/ruby&gt;が使われている。グラジアン法では直角を100分の1に分割する100進法を用いている。よってグラジアン法での1周は400 gonまたは\( 400^g \)となる。&lt;/p&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;canvas id=&quot;circlarCoordinate20220610d&quot; height=&quot;330&quot; width=&quot;330&quot;&gt;
このブラウザではHTML5 Canvasが動作しません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;1 gonを更に細分化したdgonは0.1 gonを意味しており、更に細分化したcgonは0.01 gonを意味しており、mgonは0.001 gonを意味している。&lt;/p&gt;
&lt;p&gt;度数法による値dとグラジアン法による値gとを相互変換するには次のような計算をする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align}
g &amp;amp;= \dfrac{100}{90}d \\
&amp;amp;= d \times 100 \div 90
\end{align}
\begin{align}
d &amp;amp;= \dfrac{90}{100}g \\
&amp;amp;= g \times 90 \div 100
\end{align}&lt;/div&gt;
&lt;p&gt;英語では、度数法がsexagesimal systemまたはsexagesimal measure、弧度法がcircular systemまたはcircular measure、グラジアン法がcentesimal systemまたはcentesimal measureとも呼ばれていることがある。&lt;/p&gt;
&lt;p&gt;sexagesimalは「60進法の」、circularは「円形の」、centesimalは「100進法の」という意味。measureは「尺度」「計量法」を意味しており、数学用語では「&lt;ruby&gt;&lt;rb&gt;測度&lt;/rb&gt;&lt;rt&gt;そくど&lt;/rt&gt;&lt;/ruby&gt;」を意味している。&lt;/p&gt;
&lt;p&gt;度数法は英国式とも呼ばれており、グラジアン法はフランス式とも呼ばれている。&lt;/p&gt;
&lt;p&gt;角度が1周するといくつになるか、度数法と弧度法とターン法とグラジアン法とを比較してみた。&lt;/p&gt;
&lt;table style=&quot;margin-left:auto; margin-right:auto;&quot;&gt;
&lt;caption&gt;1周（1回転）の角度&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;測定法&lt;/th&gt;
&lt;th&gt;数値&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;度数法&lt;/td&gt;
&lt;td&gt;360°&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;弧度法（&amp;pi;表記）&lt;/td&gt;
&lt;td&gt;2&amp;pi; = 6.283185...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;弧度法（&amp;tau;表記）&lt;/td&gt;
&lt;td&gt;&amp;tau; = 6.283185...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ターン法&lt;/td&gt;
&lt;td&gt;1 turn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;グラジアン法&lt;/td&gt;
&lt;td&gt;400 gon&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;度数法に対する各種角度単位系の関係表&lt;/h4&gt;
&lt;p&gt;度とその他の単位との関係表を作ってみた。ただし15°毎。分数は便宜上約分していない。&amp;pi;は円周率。\( \cdot \)は乗算記号。&lt;/p&gt;
&lt;style&gt;.moment{
  background-color : cornsilk;
}&lt;/style&gt;
&lt;table style=&quot;margin-left:auto; margin-right:auto;&quot;&gt;
&lt;caption&gt;&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;°&lt;/th&gt;
&lt;th&gt;rad&lt;/th&gt;
&lt;th&gt;turn&lt;/th&gt;
&lt;th&gt;gon&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;\( \dfrac{15}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{15}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{15}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;\( \dfrac{30}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{30}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{30}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;\( \dfrac{45}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{45}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{45}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;\( \dfrac{60}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{60}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{60}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;\( \dfrac{75}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{75}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{75}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;\( \dfrac{90}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{90}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{90}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;\( \dfrac{105}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{105}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{105}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;\( \dfrac{120}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{120}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{120}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;135&lt;/td&gt;
&lt;td&gt;\( \dfrac{135}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{135}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{135}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;\( \dfrac{150}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{150}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{150}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;165&lt;/td&gt;
&lt;td&gt;\( \dfrac{165}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{165}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{165}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;td&gt;\( \dfrac{180}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{180}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{180}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;195&lt;/td&gt;
&lt;td&gt;\( \dfrac{195}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{195}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{195}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;210&lt;/td&gt;
&lt;td&gt;\( \dfrac{210}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{210}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{210}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;225&lt;/td&gt;
&lt;td&gt;\( \dfrac{225}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{225}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{225}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;240&lt;/td&gt;
&lt;td&gt;\( \dfrac{240}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{240}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{240}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;255&lt;/td&gt;
&lt;td&gt;\( \dfrac{255}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{255}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{255}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;270&lt;/td&gt;
&lt;td&gt;\( \dfrac{270}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{270}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{270}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;285&lt;/td&gt;
&lt;td&gt;\( \dfrac{285}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{285}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{285}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;\( \dfrac{300}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{300}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{300}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;315&lt;/td&gt;
&lt;td&gt;\( \dfrac{315}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{315}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{315}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;330&lt;/td&gt;
&lt;td&gt;\( \dfrac{330}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{330}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{330}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;345&lt;/td&gt;
&lt;td&gt;\( \dfrac{345}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{345}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{345}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&quot;moment&quot;&gt;
&lt;td&gt;360&lt;/td&gt;
&lt;td&gt;\( \dfrac{360}{180}\pi \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{360}{360} \)&lt;/td&gt;
&lt;td&gt;\( \dfrac{360}{90} \cdot 100 \)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;度数法と弧度法との相互変換&lt;/h4&gt;
&lt;p&gt;度数法での角度の値dと弧度法での角度の値rとの関係は次の式で表すことができる。このrは半径のことではなくラジアンのこと。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align}
d &amp;amp;= \dfrac{180}{\pi}r \\
&amp;amp;= r \times 180 \div \pi
\end{align}
\begin{align}
r &amp;amp;= \dfrac{\pi}{180}d \\
&amp;amp;= d \times \pi \div 180
\end{align}&lt;/div&gt;
&lt;p&gt;ラジアンrに180を掛けて円周率&amp;pi;で割ると度dが求まり、度dに円周率&amp;pi;を掛けて180で割るとラジアンrが求まる。この計算には円周率が絡むので計算機や計算機言語などを利用すると便利。&lt;/p&gt;
&lt;p&gt;例えば度数法での60°が弧度法では何radになるかを&lt;a href=&quot;https://maxima.sourceforge.io/&quot;&gt;Maxima&lt;/a&gt;を使って計算してみた。その逆も。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ maxima
Maxima 5.42.1 http://maxima.sourceforge.net
using Lisp GNU Common Lisp (GCL) GCL 2.6.12
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1) 60*%pi/180;
                                      %pi
(%o1)                                 ---
                                       3
(%i2) float(%o1);
(%o2)                          1.047197551196597
(%i3) %o2*180/%pi;
                               188.4955592153875
(%o3)                          -----------------
                                      %pi
(%i4) float(%o3);
(%o4)                                60.0
(%i5) quit();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このとおり、60°はおよそ1.047197551196597 radだった。逆演算をしてみると60.0°に戻った。&lt;/p&gt;
&lt;p&gt;60°は1 radよりも僅かに大きい。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.r-project.org/&quot;&gt;R&lt;/a&gt;でも同様に計算してみた。&amp;lt;-はR言語での代入演算子。左へ代入するなら=も代入演算子として使えることはあまり知られていない。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ R
R version 3.5.2 (2018-12-20) -- &quot;Eggshell Igloo&quot;
Copyright (C) 2018 The R Foundation for Statistical Computing
（中略）
&amp;gt; radian &amp;lt;- 60*pi/180
&amp;gt; radian
[1] 1.047198
&amp;gt; degree &amp;lt;- radian*180/pi
&amp;gt; degree
[1] 60
&amp;gt; q();
Save workspace image? [y/n/c]: n&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rでも同じ結果が得られた。&lt;/p&gt;
&lt;p&gt;1 radは何°だろうか。Maximaで計算してみた。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ maxima
Maxima 5.42.1 http://maxima.sourceforge.net
（中略）
(%i1) float(1*180/%pi);
(%o1)                          57.29577951308232
(%i2) float(%o1*%pi/180);
(%o2)                                 1.0
(%i3) quit();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;1 radはおよそ57.29577951308232°だった。60°よりも僅かに小さい。&lt;/p&gt;
&lt;p&gt;1°は何radだろうか。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ maxima
Maxima 5.42.1 http://maxima.sourceforge.net
（中略）
(%i1) float(1*%pi/180);
(%o1)                         0.01745329251994329
(%i2) float(%o1*180/%pi);
(%o2)                                 1.0
(%i3) quit();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;1°はおよそ0.01745329251994329 radだった。&lt;/p&gt;
&lt;h4&gt;度数法とターン法との相互変換&lt;/h4&gt;
&lt;p&gt;度数法による値をdとし、ターン法による値をtとすると、それらは次のような計算によって相互変換できる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align}
t &amp;amp;= \dfrac{1}{360}d \\
&amp;amp;= \dfrac{d}{360} \\
&amp;amp;= d \div 360
\end{align}
\begin{align}
d &amp;amp;= \dfrac{360}{1}t \\
&amp;amp;= t \times 360
\end{align}&lt;/div&gt;
&lt;p&gt;要するに、度をターンに変換するには度の値を360で割り、ターンを度に変換するにはターンの値を360倍する。&lt;/p&gt;
&lt;h4&gt;弧度法とターン法との相互変換&lt;/h4&gt;
&lt;p&gt;弧度法の値rとターン法の値tとの相互変換は次のように計算できそう。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align}
r &amp;amp;= 2\pi t \\
&amp;amp;= t \times 2 \times \pi
\end{align}
\begin{align}
t &amp;amp;= \dfrac{r}{2\pi} \\
&amp;amp;= r \div (2 \times \pi)
\end{align}&lt;/div&gt;
&lt;p&gt;ターンからラジアンを求めるにはターンを2&amp;pi;倍する。ラジアンからターンを求めるにはラジアンを2&amp;pi;で割る。2&amp;pi;は&amp;pi;の2倍のこと。&lt;/p&gt;
&lt;h4&gt;各種計算機言語での度数法・弧度法変換&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://julialang.org/&quot;&gt;Julia&lt;/a&gt;での度数法と弧度法の相互変換はdeg2rad()とrad2deg()という2つの組み込みメソッドを利用することで可能。deg2rad()は度からラジアンへの変換を行ってくれ、rad2deg()はラジアンから度への変換を行ってくれる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ julia
（中略）
julia&amp;gt; deg2rad(1)
0.017453292519943295

julia&amp;gt; rad2deg(1)
57.29577951308232

julia&amp;gt; exit()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt;3ではmathをimportしてmath.radians()とmath.degrees()を利用できる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ python3
Python 3.7.3
（中略）
&amp;gt;&amp;gt;&amp;gt; import math
&amp;gt;&amp;gt;&amp;gt; math.radians(180)
3.141592653589793
&amp;gt;&amp;gt;&amp;gt; math.degrees(math.pi)
180.0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Numpyをimportすればnumpy.deg2rad()とnumpy.rad2deg()を利用できる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import numpy as np
&amp;gt;&amp;gt;&amp;gt; np.deg2rad(360)
6.283185307179586
&amp;gt;&amp;gt;&amp;gt; np.rad2deg(2*math.pi)
360.0
&amp;gt;&amp;gt;&amp;gt; exit()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;R言語ではNISTunitsというパッケージを利用できる。NISTunitsをインストールし、ライブラリーとして読み込んでNISTdegTOradian()とNISTradianTOdeg()を呼び出す。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ R
R version 3.5.2 (2018-12-20) -- &quot;Eggshell Igloo&quot;
（中略）
&amp;gt; install.packages(&quot;NISTunits&quot;,dependencies=T)
（中略）
&amp;gt; library(NISTunits)
&amp;gt; NISTdegTOradian(1)
[1] 0.01745329
&amp;gt; NISTradianTOdeg(1)
[1] 57.29579&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rではunitsというパッケージを利用することもできる。&lt;/p&gt;
&lt;p&gt;unitsをインストールし、ライブラリーとして読み込む。そしてas_units()の第1引数に数値、第2引数に単位を付加することによりその数値に単位を付けてそれを変数に代入し、今度はset_units()の第1引数にその変数を指定して第2引数に変換したい単位を指定してやると変換後の値が返ってくる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt; install.packages(&#39;units&#39;)
（中略）
&amp;gt; library(units)
udunits database from /usr/share/xml/udunits/udunits2.xml
&amp;gt; deg &amp;lt;- as_units(1,&quot;degrees&quot;)
&amp;gt; rad &amp;lt;- set_units(deg,&quot;radians&quot;)
&amp;gt; rad
0.01745329 [rad]
&amp;gt; rad &amp;lt;- as_units(1,&quot;radians&quot;)
&amp;gt; deg &amp;lt;- set_units(rad,&quot;degrees&quot;)
&amp;gt; deg
57.29578 [°]
&amp;gt; q()
Save workspace image? [y/n/c]: n&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;unitsのインストールでコンフィギュレーションに失敗することがある。そのときはエラー・メッセージに指示されているとおりにする。例えばUbuntuやDebianではlibudunits2-devというdebパッケージをインストールする必要があるかもしれない。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://octave.org/&quot;&gt;GNU Octave&lt;/a&gt;ではdeg2rad()とrad2deg()を利用できる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ octave
GNU Octave, version 4.4.1
Copyright (C) 2018 John W. Eaton and others
（中略）
octave:1&amp;gt; deg2rad([1,90,180,360])
ans =

   0.017453   1.570796   3.141593   6.283185

octave:2&amp;gt; rad2deg([1,pi,2*pi])
ans =

    57.296   180.000   360.000

octave:3&gt; quit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;LibreOffice CalcにはDEGREES()という函数とRADIANS()という函数がある。これらを利用するとラジアン単位と度単位を相互に変換することができる。1 radはGEGREES(1) ≒ 57.2957795130823°、1°はRADIANS(1) ≒ 0.0174532925199433 radという結果が得られた。&lt;/p&gt;
&lt;p&gt;分数の約分をコンピューターで行う便利な方法についてここでちょっとしたメモ書き。&lt;/p&gt;
&lt;div class=&quot;note&quot;&gt;
&lt;h4&gt;各種計算機言語での約分&lt;/h4&gt;
&lt;p&gt;分数の分母と分子を共に同じ整数で割るとき、1でしか割り切れない場合にはその分数は既約分数と呼ばれる。例えば\( \dfrac{2}{3} \)は\( \dfrac{2\div1}{3\div1} \)のように1でしか割り切れないので既約分数。例えば\( \dfrac{2}{4} \)のような分数は\( \dfrac{2\div2}{4\div2} \)のように2で割り切れるので既約分数ではない。&lt;/p&gt;
&lt;p&gt;既約分数でない分数を既約分数にすることを約分すると言う。英語ではReducing fractions to lowest termsと表現されたりする。&lt;/p&gt;
&lt;p&gt;約分のアルゴリズムとしては素因数分解が有用。このアルゴリズムとプログラミングについてはまた別の機会に。&lt;/p&gt;
&lt;p&gt;ここではいくつかの計算機言語で約分を行う簡単な方法を記しておく。&lt;/p&gt;
&lt;p&gt;Python3で分数を約分して既約分数に直すには有理数演算を支援するfractionsモジュールからFractionをインポートし、Fraction(分子,分母)を利用する。有理数とは分数によって表せる数の総称。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ python3
Python 3.7.3（中略）
&amp;gt;&amp;gt;&amp;gt; from fractions import Fraction
&amp;gt;&amp;gt;&amp;gt; Fraction(15,180)
Fraction(1, 12)
&amp;gt;&amp;gt;&amp;gt; quit()
$&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Maximaでは割り算の形で分数を入力してEnterを押すだけで既約分数を表示してくれる。Maximaでは式の終わりにセミコロンが必要であることに要注意。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ maxima

Maxima 5.42.1 http://maxima.sourceforge.net
（中略）
(%i1) 90/360;
                                       1
(%o1)                                  -
                                       4
(%i2) quit();
$&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Juliaで分数（有理数）を扱うには//演算子を用いる。分子//分母を入力してEnterキーを押すと既約分数を自動的に表示してくれる。次の例で使用しているJuliaはバージョン1.0.3。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ julia
（中略）
julia&amp;gt; 75//180
5//12

julia&amp;gt; exit()
$&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt;ではRationalクラスのRational(分子,分母)メソッドを利用して分数（有理数）を表せる。更に、分子/分母rという表記によっても分数を表すことができる。irb上でこれらを入力してEnterキーを押すと既約分数を自動的に表示してくれる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ irb
irb(main):001:0&amp;gt; Rational(270,180)
=&amp;gt; (3/2)
irb(main):002:0&amp;gt; 315/360r
=&amp;gt; (7/8)
irb(main):003:0&amp;gt; quit
$&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;R言語では例えば音声および音響分析用ツールが収められているphonToolsパッケージをインストールし、それをライブラリーとして読み込んだ上でreduce.fraction()を利用する。&lt;/p&gt;
&lt;p&gt;reduce.fraction()の引数には2つの整数の要素を持つベクトルを与える。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ R
R version 3.5.2 (2018-12-20) -- &quot;Eggshell Igloo&quot;
Copyright (C) 2018 The R Foundation for Statistical Computing
（中略）
&amp;gt; install.packages(&#39;phonTools&#39;,dependencies=T)
（中略）
&amp;gt; library(phonTools)
&amp;gt; reduce.fraction(c(140,203))
[1] 20 29
&amp;gt; reduce.fraction(c(15,360))
[1]  1 24
&amp;gt; q()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;install.packages()の第2引数dependencies=Tは依存関係を解決してくれるもの。&lt;/p&gt;
&lt;/div&gt;
&lt;script&gt;
&#39;use strict&#39;; // 厳密モードを有効にする

//即時実行函数式でスクリプト全体を袋とじ
(function(){

  // canvas要素とその2dコンテキストをDOMから取得する函数
  function getCanvasContext(canvasId){
    const canvas = document.getElementById(canvasId);
    if(!canvas){
      console.error(&quot;canvas要素が見つかりません&quot;);
    }else{
      const context = canvas.getContext(&quot;2d&quot;);
      if(!context){
        console.error(&quot;お使いのウェブ・ブラウザはHTML5 Canvasに未対応です&quot;);
      }else{
        return context;
      }
    }
  }

  //度数法から弧度法へ角度を変換する函数
  function toRadians(degree){
    return degree * (Math.PI/180.0);
  }

  /* 極座標（円座標）を直交座標へ変換する函数
     引数は極座標r,θ（θはラジアン表記） */
  function polarToCartesianX(r,radian){
    return r * Math.cos(radian);
  }
  function polarToCartesianY(r,radian){
    return r * Math.sin(radian);
  }

  /* 図形の部品オブジェクト */
  
  //直線オブジェクトを返すファクトリ函数
  function Line(){
    
    //プライベートなプロパティ
    const shaftTailX = 0; //始点の水平座標
    const shaftTailY = 0; //始点の垂直座標
    let shaftHeadX = 100; //終点の水平座標
    const shaftHeadY = 0; //終点の垂直座標
    let width = 1; //線の太さ
    let color = &quot;black&quot;; //線の色
    let lineDash = false; //実線か点線か

    //オブジェクト・リテラルを返す
    return {
      //パブリックなアクセサーメソッド（セッター）
      setLength : function(arg){shaftHeadX = arg;},
      setWidth : function(arg){width = arg;},
      setColor : function(arg){color = arg;},
      setLineDash : function(arg){lineDash = arg;},
       
      /* 描画メソッド：
         引数はcanvas要素のIDと描画座標と描画角度 */
      draw : function(ctx,x,y,angle){
        //この時点の状態を保存
        ctx.save();

        //座標系の原点を移動
        ctx.translate(x,y);
        /* 座標系を原点を軸に回転移動
          かつ正負を反転させて反時計回りに */
        ctx.rotate(toRadians(-1 * angle));
 
        //直線を描く
        ctx.beginPath();
        ctx.lineWidth = width;
        ctx.strokeStyle = color;
        ctx.moveTo(shaftTailX, shaftTailY);
        ctx.lineTo(shaftHeadX, shaftHeadY);
        if(lineDash == true){
          ctx.setLineDash([3,2]); //点線
        }else{
          ctx.setLineDash([0,0]); //実線
        }
        ctx.stroke();

        //save()で保存した状態を復元
        ctx.restore();   
      }
    };
  }

  //矢印オブジェクトを返すファクトリ函数
  function Arrow(){
     
    //プライベートなプロパティ
    const shaftTailX = 0; //幹末端の水平座標
    const shaftTailY = 0; //幹末端の垂直座標
    let shaftHeadX = 100; //幹先端の水平座標
    const shaftHeadY = 0; //幹先端の垂直座標
    let headLength = 7; //鏃の長さ
    let headAngle = 160; //鏃の角度
    let arrowWidth = 1; //矢印の太さ
    let color = &quot;black&quot;; //矢の色
    let lineDash = false; //実線か点線か

    //オブジェクト・リテラルを返す
    return {
      //パブリックなアクセサーメソッド（セッター）
      setArrowLength : function(arg){shaftHeadX = arg;},
      setHeadLength : function(arg){headLength = arg;},
      setHeadAngle : function(arg){headAngle = arg;},
      setArrowWidth : function(arg){arrowWidth = arg;},
      setColor : function(arg){color = arg;},
      setLineDash : function(arg){lineDash = arg;},
      //ゲッター
      getShaftHeadX : function(){return shaftHeadX;},
       
      /* 描画メソッド：
         引数はcanvas要素のIDと描画座標と描画角度 */
      draw : function(ctx,x,y,angle){
        //この時点の状態を保存
        ctx.save();

        //座標系の原点を移動
        ctx.translate(x,y);
        /* 座標系を原点を軸に回転移動
           かつ正負を反転させて反時計回りに */
        ctx.rotate(toRadians(-1 * angle));

        //矢印の幹の直線を描く
        ctx.beginPath();
        ctx.lineWidth = arrowWidth;
        ctx.strokeStyle = color;
        ctx.moveTo(shaftTailX, shaftTailY);
        ctx.lineTo(shaftHeadX, shaftHeadY);
        if(lineDash == true){
          ctx.setLineDash([3,2]); //点線
        }else{
          ctx.setLineDash([0,0]); //実線
        }
        ctx.stroke();
  
        //鏃の部分を描く
                       
        //鏃の相対的座標を計算して変数に代入
        const headLeftWingX = polarToCartesianX(headLength,
          toRadians(headAngle)) + shaftHeadX;
        const headLeftWingY = polarToCartesianY(headLength,
          toRadians(headAngle)) + shaftHeadY;
        const headRightWingX = polarToCartesianX(headLength,
          toRadians(-1 * headAngle)) + shaftHeadX;
        const headRightWingY = polarToCartesianY(headLength,
          toRadians(-1 * headAngle)) + shaftHeadY;
  
        //鏃を描く
        ctx.beginPath();
        ctx.moveTo(shaftHeadX, shaftHeadY);
        ctx.lineTo(headLeftWingX, headLeftWingY);
        ctx.moveTo(shaftHeadX, shaftHeadY);
        ctx.lineTo(headRightWingX, headRightWingY);
        ctx.stroke();
  
        //save()で保存した状態を復元
        ctx.restore();   
      }
    };
  }

  //点オブジェクトを返すファクトリ函数
  function Point() {
    //プライベート変数群
    let color = &quot;black&quot;; //色
    let radius = 2; //半径
    let x = 10; //中心点の水平座標
    let y = 10; //中心点の垂直座標

    return {
      //アクセサー（セッター）
      setColor : function(arg){color = arg;},
      setRadius : function(arg){radius = arg;},
      setX : function(arg){x = arg;},
      setY : function(arg){y = arg;},

      //描画メソッド
      draw : function(ctx,x,y){
        //このメソッドの引数をプライベートなプロパティに設定
        this.setX(x);
        this.setY(y);

        ctx.beginPath();
        ctx.arc(x,y,radius,0,360);
        ctx.fill();
      }
    };
  }

  //円弧オブジェクトを返すファクトリ函数
  function Arc() {
    //プライベート変数群
    let startingAngle = 0; //始点の角度
    let endingAngle = 360; //終点の角度
    let radius = 20; //半径
    let centerX = 50; //中心点の水平座標
    let centerY = 50; //中心点の垂直座標
    let direction = true; //trueで反時計回り
    let color = &quot;black&quot;; //線の色
    let width = 1; //線の太さ
    let lineDash = false; //実線か点線か

    return { //オブジェクト・リテラルを返す
      //アクセサー（セッター）
      setStartingAngle : function(arg){startingAngle = arg;},
      setEndingAngle : function(arg){endingAngle = arg;},
      setRadius : function(arg){radius = arg;},
      setCenterX : function(arg){centerX = arg;},
      setCenterY : function(arg){centerY = arg;},
      setDirection : function(arg){direction = arg;},
      setColor : function(arg){color = arg;},
      setWidth : function(arg){width = arg;},
      setLineDash : function(arg){lineDash = arg;},
      
      //描画メソッド
      draw : function(ctx){
        //引数をプライベートなプロパティに設定
        this.setCenterX(centerX);
        this.setCenterY(centerY);
        this.setRadius(radius);
        ctx.beginPath(); //パスの初期化
        ctx.arc( //円弧函数を呼び出す
          centerX, //中心点の水平座標
          centerY, //中心点の垂直座標
          radius, //円の半径
          toRadians(startingAngle), //開始角度
          toRadians(endingAngle), //終了角度
          direction //回転方向
        );
        ctx.strokeStyle = color; //線の色
        ctx.lineWidth = width; //線の太さ
        if(lineDash == true){
          ctx.setLineDash([3,2]); //点線
        }else{
          ctx.setLineDash([0,0]); //実線
        }
        ctx.stroke(); //描画
      }
    };
  }

  //ラベル・オブジェクトを返すファクトリ函数
  function Label(){

    //プライベートなプロパティ
    let font = &quot;13px serif&quot;;
    let color = &quot;black&quot;;
    let align = &quot;center&quot;;
    let baseline = &quot;middle&quot;;

    //オブジェクト・リテラルを返す
    return {

      //アクセサー（セッター）
      setFont : function(arg){font = arg;},
      setColor : function(arg){color = arg;},
      setAlign : function(arg){align = arg;},
      setBaseline : function(arg){baseline = arg;},

      //描画メソッド
      draw : function(ctx,text,x,y,largestWidth){
        //文字列を描画する
        ctx.font = font;
        ctx.fillStyle = color;
        ctx.textAlign = align;
        ctx.textBaseline = baseline;
        ctx.fillText(text,x,y,largestWidth);
      }
    };
  }

  // 図形の部品をインスタンス化
  const line1 = Line();
  const arrow1 = Arrow();
  const arc1 = Arc();
  const point1 = Point();
  const label1 = Label();
  

  //角度のモデル図a函数
  function angleModelA(canvasId) {
    const arrow2 = Arrow();
    const arc2 = Arc();
    const point2 = Point();
    const label2 = Label();

    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const canvas = document.getElementById(canvasId);
    const ctx = canvas.getContext(&quot;2d&quot;);
    
    arrow2.draw(ctx,15,100,0);
    arrow2.draw(ctx,15,100,60);
    point2.draw(ctx,15,100);
    arc2.setEndingAngle(-60);
    arc2.setCenterX(15);
    arc2.setCenterY(100);
    arc2.setRadius(20);
    arc2.draw(ctx);
    label2.draw(ctx,&quot;O&quot;,7,107,20);
    label2.draw(ctx,&quot;θ&quot;,40,85,20);
  }
  angleModelA(&quot;angleModel20220610a&quot;);

  function angleModelB(canvasId){
    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);
  
    //角度のモデル図b
    arrow1.draw(ctx,30,100,-15);
    arrow1.draw(ctx,30,100,105);
    point1.draw(ctx,30,100);
    arc1.setStartingAngle(15);
    arc1.setEndingAngle(-105);
    arc1.setCenterX(30);
    arc1.setCenterY(100);
    arc1.setRadius(20);
    arc1.draw(ctx);
    label1.draw(ctx,&quot;P&quot;,22,108,20);
    label1.draw(ctx,&quot;φ&quot;,50,75,20);
  }
  angleModelB(&quot;angleModel20220610b&quot;);

  //初等幾何学的な角度のモデル図
  function angleModelC(canvasId){
    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);
    
    arrow1.draw(ctx,15,100,0);
    arrow1.draw(ctx,15,100,60);
    point1.draw(ctx,15,100);
    point1.draw(ctx,58,25);
    point1.draw(ctx,100,100);
    label1.draw(ctx,&quot;A&quot;,47,25,20);
    label1.draw(ctx,&quot;B&quot;,5,100,20);
    label1.draw(ctx,&quot;C&quot;,100,90,20);
    arc1.setCenterX(15);
    arc1.setCenterY(100);
    arc1.setRadius(20);
    arc1.setStartingAngle(0);
    arc1.setEndingAngle(-60);
    arc1.draw(ctx);
  }
  angleModelC(&quot;geometricModelOfAngle20220610&quot;);

  //鋭角と鈍角のモデル図
  function angleModelD(canvasId){
    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);
    
    arrow1.draw(ctx,100,100,0);
    arrow1.draw(ctx,100,100,180);
    arrow1.draw(ctx,100,100,60);
    arc1.setColor(&quot;blue&quot;);
    arc1.setCenterX(100);
    arc1.setCenterY(100);
    arc1.setRadius(20);
    arc1.draw(ctx);
    arc1.setColor(&quot;red&quot;);
    arc1.setStartingAngle(-60);
    arc1.setEndingAngle(-180);
    arc1.draw(ctx);
    point1.draw(ctx,100,100);
  }
  angleModelD(&quot;acuteAndObtuseAngle20220610&quot;);

  //complementary anglesのモデル図
  function complementaryAnglesModel(canvasId){
    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);
    
    arrow1.draw(ctx,5,100,0);
    arrow1.draw(ctx,5,100,30);
    arrow1.draw(ctx,5,100,90);
    arc1.setColor(&quot;blue&quot;);
    arc1.setStartingAngle(0);
    arc1.setEndingAngle(-30);
    arc1.setCenterX(5);
    arc1.setCenterY(100);
    arc1.setRadius(20);
    arc1.draw(ctx);
    arc1.setColor(&quot;red&quot;);
    arc1.setStartingAngle(-30);
    arc1.setEndingAngle(-90);
    arc1.draw(ctx);
    point1.draw(ctx,5,100);
  }
  complementaryAnglesModel(&quot;supplementaryAngle20220610&quot;);

  //対頂角のモデル図
  function taityouAngleModel(canvasId){
    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);
    
    arrow1.draw(ctx,100,100,60);
    arrow1.draw(ctx,100,100,240);
    arrow1.draw(ctx,100,100,120);
    arrow1.draw(ctx,100,100,300);
    point1.draw(ctx,100,100);
    arc1.setColor(&quot;blue&quot;);
    arc1.setStartingAngle(-300);
    arc1.setEndingAngle(-60);
    arc1.setCenterX(100);
    arc1.setCenterY(100);
    arc1.setRadius(20);
    arc1.draw(ctx);
    arc1.setColor(&quot;red&quot;);
    arc1.setStartingAngle(-60);
    arc1.setEndingAngle(-120);
    arc1.draw(ctx);
    arc1.setColor(&quot;green&quot;);
    arc1.setStartingAngle(-120);
    arc1.setEndingAngle(-240);
    arc1.draw(ctx);
    arc1.setColor(&quot;purple&quot;);
    arc1.setStartingAngle(-240);
    arc1.setEndingAngle(-300);
    arc1.draw(ctx);
    label1.draw(ctx,&quot;α&quot;,130,100,10);
    label1.draw(ctx,&quot;β&quot;,70,100,10);
    label1.draw(ctx,&quot;θ&quot;,100,70,10);
    label1.draw(ctx,&quot;φ&quot;,100,130,10);
  }
  taityouAngleModel(&quot;verticallyOppositeAngle20220610&quot;);

  //平角のモデル図
  function straightAngleModel(canvasId){
    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);
      
    arrow1.draw(ctx,100,30,0);
    arrow1.draw(ctx,100,30,-180);
    arc1.setColor(&quot;black&quot;);
    arc1.setStartingAngle(0);
    arc1.setEndingAngle(-180);
    arc1.setCenterX(100);
    arc1.setCenterY(30);
    arc1.setRadius(20);
    arc1.draw(ctx);
    point1.draw(ctx,100,30);
  }
  straightAngleModel(&quot;straightAngle20220610&quot;);
  
  //角度のモデルの標準位置を示す図
  function standardPositionOfAngle(canvasId){
    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);
    
    arrow1.draw(ctx,5,10,0);
    point1.draw(ctx,5,10);
  }
  standardPositionOfAngle(&quot;standardPosition20220610&quot;);

  //単位円
  function unitCircle(canvasId){
    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);
    
    line1.draw(ctx,110,110,0);
    arc1.setColor(&quot;black&quot;);
    arc1.setStartingAngle(0);
    arc1.setEndingAngle(-360);
    arc1.setCenterX(110);
    arc1.setCenterY(110);
    arc1.setRadius(100);
    arc1.draw(ctx);
    point1.draw(ctx,110,110);
    arc1.setStartingAngle(-50);
    arc1.setEndingAngle(-85);
    arc1.setCenterX(160);
    arc1.setCenterY(170);
    arc1.setRadius(78);
    arc1.draw(ctx);
    arc1.setStartingAngle(-95);
    arc1.setEndingAngle(-130);
    arc1.draw(ctx);
    label1.draw(ctx,&quot;1&quot;,160,93,10);
  }
  unitCircle(&quot;unitCircle20220610&quot;);
        
  //円座標系を描く函数
  function circularCoordinate(
    canvasId, //canvas要素のID属性
    centerX, //中心点の水平座標
    centerY) //中心点の垂直座標
  {
    //オブジェクトを作成
    const arrow3 = Arrow();
    const arc3 = Arc();

    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);

    //単位円を描く
    arc3.setCenterX(centerX);
    arc3.setCenterY(centerY);
    arc3.setRadius(100);
    arc3.setStartingAngle(0);
    arc3.setEndingAngle(360);
    arc3.draw(ctx);

    //角度アームを描く
    arrow3.setArrowLength(115);
    for (let i = 0; i &lt; 360; i = i + 15) {
      //90度毎にアームを黒くする
      if (i % 90 == 0) {
        arrow3.setColor(&quot;black&quot;);
      } else	{
        arrow3.setColor(&quot;gray&quot;);
      }
      arrow3.draw(ctx,centerX,centerY,i);
    }
  }
  //円座標系を描く函数を呼び出す
  circularCoordinate(&quot;circlarCoordinate20220610a&quot;,170,170);
  circularCoordinate(&quot;circlarCoordinate20220610b&quot;,170,170);
  circularCoordinate(&quot;circlarCoordinate20220610c&quot;,170,170);
  circularCoordinate(&quot;circlarCoordinate20220610d&quot;,170,170);

  //ラベルを円状に表示する函数（半汎用）
  function labelsOfCirclarCoordinate(
    canvasId, //canvas要素のID属性
    labels, //ラベルの配列を受け取る
    angle, //角度の間隔単位
    centerX, //中心点の水平座標
    centerY, //中心点の垂直座標
    radius, //半径の長さ
    startingAngle) //開始角度
  {
    //ラベル・オブジェクトを利用
    const label3 = Label();

    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);

    for (let i = 0; i &lt; labels.length; i++) {
      //ラベル・オブジェクトの描画メソッドを呼び出す
      //（canvas要素のID,ラベル,x座標,y座標,最大幅）
      label3.draw(ctx,labels[i],
        //極座標を直交座標へ変換
        polarToCartesianX(radius+17,
          toRadians(i*angle+startingAngle))+centerX,
        -1*polarToCartesianY(radius+17,
          toRadians(i*angle+startingAngle))+centerY,35);
    }
  }

  //度数法による値の配列リテラル
  const degrees1 = new Array(24);
  degrees1[0] = &quot;0;360&quot;;
  for (let i = 1; i &lt; degrees1.length; i++) {
    degrees1[i] = i * 15;
  }

  //弧度法による値の配列リテラル
  const radians1 = [&quot;0;2π&quot;,&quot;π/12&quot;,&quot;π/6&quot;,&quot;π/4&quot;,&quot;π/3&quot;,&quot;5π/12&quot;,
    &quot;π/2&quot;,&quot;7π/12&quot;,&quot;2π/3&quot;,&quot;3π/4&quot;,&quot;5π/6&quot;,&quot;11π/12&quot;,
    &quot;π&quot;,&quot;13π/12&quot;,&quot;7π/6&quot;,&quot;5π/4&quot;,&quot;4π/3&quot;,&quot;17π/12&quot;,
    &quot;3π/2&quot;,&quot;19π/12&quot;,&quot;5π/3&quot;,&quot;7π/4&quot;,&quot;11π/6&quot;,&quot;23π/12&quot;];

  //円定数τ（円周率／半径）による値の配列リテラル
  const turn1 = [&quot;0;τ&quot;,&quot;1/24τ&quot;,&quot;1/12τ&quot;,&quot;1/8τ&quot;,&quot;1/6τ&quot;,&quot;5/24τ&quot;,
    &quot;1/4τ&quot;,&quot;7/24τ&quot;,&quot;1/3τ&quot;,&quot;3/8τ&quot;,&quot;5/12τ&quot;,&quot;11/24τ&quot;,&quot;1/2τ&quot;,
    &quot;13/24τ&quot;,&quot;7/12τ&quot;,&quot;5/8τ&quot;,&quot;2/3τ&quot;,&quot;17/24τ&quot;,&quot;3/4τ&quot;,
    &quot;19/24τ&quot;,&quot;5/6τ&quot;,&quot;7/8τ&quot;,&quot;11/12τ&quot;,&quot;23/24τ&quot;];

  //グラジアンによる値の配列リテラル
  const gradians1 = [&quot;0;400&quot;,&quot;50/3&quot;,&quot;100/3&quot;,&quot;50&quot;,&quot;200/3&quot;,&quot;250/3&quot;,
    &quot;100&quot;,&quot;350/3&quot;,&quot;400/3&quot;,&quot;150&quot;,&quot;500/3&quot;,&quot;550/3&quot;,&quot;200&quot;,&quot;650/3&quot;,&quot;700/3&quot;,
    &quot;250&quot;,&quot;800/3&quot;,&quot;850/3&quot;,&quot;300&quot;,&quot;950/3&quot;,&quot;1000/3&quot;,&quot;350&quot;,&quot;1100/3&quot;,&quot;1150/3&quot;];

  //ラベルを付ける函数を呼び出す
  labelsOfCirclarCoordinate(&quot;circlarCoordinate20220610a&quot;,
    degrees1,15,170,170,120,0);
  labelsOfCirclarCoordinate(&quot;circlarCoordinate20220610b&quot;,
    radians1,15,170,170,120,0);
  labelsOfCirclarCoordinate(&quot;circlarCoordinate20220610c&quot;,
    turn1,15,170,170,120,0);
  labelsOfCirclarCoordinate(&quot;circlarCoordinate20220610d&quot;,
    gradians1,15,170,170,120,0);

  //弧度法を説明するための単位円
  function unitCircleForRadian(canvasId){
    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);
    
    line1.setColor(&quot;blue&quot;);
    line1.draw(ctx,110,110,57.2957795130823);
    line1.draw(ctx,110,110,0);
    point1.draw(ctx,110,110);
    arc1.setStartingAngle(0);
    arc1.setEndingAngle(-57.2957795130823);
    arc1.setCenterX(110);
    arc1.setCenterY(110);
    arc1.setRadius(100);
    arc1.setColor(&quot;red&quot;);
    arc1.draw(ctx);
    arc1.setStartingAngle(-57.2957795130823);
    arc1.setEndingAngle(-360);
    arc1.setColor(&quot;grey&quot;);
    arc1.draw(ctx);
    arc1.setColor(&quot;black&quot;);
    arc1.setStartingAngle(0);
    arc1.setEndingAngle(-57.2957795130823);
    arc1.setRadius(20);
    arc1.draw(ctx);
    label1.draw(ctx,&quot;r&quot;,160,120,20);
    label1.draw(ctx,&quot;r&quot;,130,60,20);
    label1.draw(ctx,&quot;a&quot;,205,55,20);
    label1.draw(ctx,&quot;θ&quot;,135,97,30);
  }
  unitCircleForRadian(&quot;radianSystem20220610&quot;);

  //正三角形×6による六角形と度数法の図
  //単位円を6等分する
  function divideUnitCircle(canvasId){
    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);
    
    line1.draw(ctx,110,110,0);
    line1.draw(ctx,110,110,-60);
    line1.draw(ctx,110,110,-120);
    line1.draw(ctx,110,110,-180);
    line1.draw(ctx,110,110,-240);
    line1.draw(ctx,110,110,-300);
  }
  divideUnitCircle(&quot;regularHexagon20220610&quot;);
  
  //正六角形のオブジェクト
  const regularHexagon = {
    //作成した2つの函数を利用して正六角形の角の座標を求める
    hexAngle0X : polarToCartesianX(100,toRadians(0)),
    hexAngle0Y : polarToCartesianY(100,toRadians(0)),
    hexAngle60X : polarToCartesianX(100,toRadians(-60)),
    hexAngle60Y : polarToCartesianY(100,toRadians(-60)),
    hexAngle120X : polarToCartesianX(100,toRadians(-120)),
    hexAngle120Y : polarToCartesianY(100,toRadians(-120)),
    hexAngle180X : polarToCartesianX(100,toRadians(-180)),
    hexAngle180Y : polarToCartesianY(100,toRadians(-180)),
    hexAngle240X : polarToCartesianX(100,toRadians(-240)),
    hexAngle240Y : polarToCartesianY(100,toRadians(-240)),
    hexAngle300X : polarToCartesianX(100,toRadians(-300)),
    hexAngle300Y : polarToCartesianY(100,toRadians(-300)),
    //描画メソッド（canvas要素のID属性,x座標,y座標）
    draw : function(canvasId,x,y){
      /* HTML5 Canvas 2DのAPIを利用する準備 */
      const ctx = getCanvasContext(canvasId);
      
      ctx.strokeStyle = &quot;blue&quot;;
      ctx.beginPath();
      ctx.moveTo(x+this.hexAngle0X,y+this.hexAngle0Y);
      ctx.lineTo(x+this.hexAngle60X,y+this.hexAngle60Y);
      ctx.lineTo(x+this.hexAngle120X,y+this.hexAngle120Y);
      ctx.lineTo(x+this.hexAngle180X,y+this.hexAngle180Y);
      ctx.lineTo(x+this.hexAngle240X,y+this.hexAngle240Y);
      ctx.lineTo(x+this.hexAngle300X,y+this.hexAngle300Y);
      ctx.closePath();
      ctx.stroke();
    }
  };
  //regularHexagonオブジェクトの描画メソッドを呼び出す
  regularHexagon.draw(&quot;regularHexagon20220610&quot;,110,110);
  
  //中心角を表す円弧を描く
  function arcOfCentralAngle(canvasId){
    /* HTML5 Canvas 2DのAPIを利用する準備 */
    const ctx = getCanvasContext(canvasId);
    
    arc1.setEndingAngle(-360);
    arc1.setColor(&quot;red&quot;);
    arc1.setCenterX(110);
    arc1.setCenterY(110);
    arc1.setRadius(15);
    arc1.draw(ctx);
    arc1.setStartingAngle(-120);
    arc1.setEndingAngle(-180);
    arc1.setCenterX(regularHexagon.hexAngle0X+110);
    arc1.setCenterY(regularHexagon.hexAngle0Y+110);
    arc1.setRadius(15);
    arc1.draw(ctx);
    arc1.setStartingAngle(-240);
    arc1.setEndingAngle(-300);
    arc1.setCenterX(regularHexagon.hexAngle60X+110);
    arc1.setCenterY(regularHexagon.hexAngle60Y+110);
    arc1.draw(ctx);
    //角度（60°）のラベルを描く
    label1.draw(ctx,&quot;60&quot;,
      regularHexagon.hexAngle0X+110-25,
      regularHexagon.hexAngle0Y+110-10,20);
    label1.draw(ctx,&quot;60&quot;,
      regularHexagon.hexAngle60X+110+0,
      regularHexagon.hexAngle60Y+110+25,20);
    //正三角形の角度60の配列リテラル
    const angle60 = [60,60,60,60,60,60];
    //円状にラベルを貼る函数を呼び出す
    labelsOfCirclarCoordinate(canvasId,angle60,60,110,110,10,30);
  }
  arcOfCentralAngle(&quot;regularHexagon20220610&quot;);

  //正凸360角形を描く
  //正凸多角形オブジェクトを返すファクトリ函数
  function RegularConvexPolygon(){
    //プライベートなプロパティ
    let sideNumber = 6; //辺の数
    let sideAngle = 60; //一辺の角度
    let radius = 100; //多角形の半径
    let fillColor = &quot;skyblue&quot;; //塗りつぶす色
    let strokeColor = &quot;black&quot;; //線の色

    //オブジェクト・リテラルを返す
    return {
      //アクセサー（セッター）
      setSideNumber : function(arg){
        sideNumber = arg;
        sideAngle = 360 / arg;},
      setRadius : function(arg){radius = arg;},
      setFillColor : function(arg){fillColor = arg;},
      setStrokeColor : function(arg){strokeColor = arg;},
      //アクセサー（ゲッター）
      getSideNumber : function(){return sideNumber;},
      getSideRadius : function(){return sideAngle;},
      getRadius : function(){return radius;},

      //描画メソッド
      draw : function(ctx,canvasId,centerX,centerY){
        // HTML5 Canvasを使う準備
        const canvas = document.getElementById(canvasId);
        
        //画面をクリア
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        //辺のパス
        ctx.beginPath(); //初期化
        ctx.moveTo(centerX+radius,centerY); //線の始点
        //1から辺の数までの回数繰り返す
        for(let i = 1; i &lt;= sideNumber; i++){
          let angle = i * sideAngle; //角度を回数倍
          const x = centerX + polarToCartesianX(radius,
            toRadians(angle)); //水平座標を求める
          const y = centerY + polarToCartesianY(radius,
            toRadians(angle)); //垂直座標を求める
          ctx.lineTo(x,y); //線のパスの座標を指定
        }
        ctx.closePath(); //パスを閉じる
        ctx.strokeStyle = strokeColor; //線の色
        ctx.stroke(); //線を描画
        ctx.fillStyle = &quot;skyblue&quot;; //塗りつぶす色
        ctx.fill(); //塗りつぶす

        //中心点から放射状に伸びる直線のパス
        ctx.beginPath(); //パスを初期化
        ctx.moveTo(centerX,centerY); //線の始点
        ctx.lineTo(centerX+radius,centerY);
        for(let i = 1; i &lt;= sideNumber-1; i++){
          let angle = i * sideAngle; //角度を回数倍
          const x = centerX + polarToCartesianX(radius,
            toRadians(angle)); //水平座標を求める
          const y = centerY + polarToCartesianY(radius,
            toRadians(angle)); //垂直座標を求める
          ctx.moveTo(centerX,centerY);
          ctx.lineTo(x,y);
        }
        ctx.closePath(); //パスを閉じる
        ctx.stroke(); //線を描く
      }
    };
  }

  //正凸n角形描くイベント・ハンドラー
  function drawPolygon(canvasId){
    let inputElement = null;
    let inputSideNumber = null;
    try{
      //input要素のvalue属性を取得して数値に変換
      inputElement = document.getElementById(&quot;inp20220610&quot;);
      //文字列を解析して最初の整数を返す函数parseInt()
      inputSideNumber = parseInt(inputElement.value,10);
    }catch(error){
      console.log(&quot;input要素のvalue属性の取得に失敗しました&quot;, error.message);
    }

    let canvas = null;
    let ctx = null;
    try{
      //HTML5 Canvasを利用
      canvas = document.getElementById(canvasId);
      ctx = canvas.getContext(&quot;2d&quot;);
    }catch(error){
      console.log(&quot;canvas要素の取得に失敗しました。&quot;, error.message);
    }
    
    //画面をクリア
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    
    ctx.font = &quot;25px serif&quot;; //フォントの属性
    ctx.fillStyle = &quot;red&quot;; //塗りつぶす色

    //数値の範囲を検査
    if(inputSideNumber &gt;= 3 &amp;&amp; inputSideNumber &lt;= 360)
    {
      //正凸多角形オブジェクトを作成
      const oPoly = RegularConvexPolygon();

      //辺の数を設定
      oPoly.setSideNumber(inputSideNumber);
      //半径を設定
      oPoly.setRadius(250);
      //描画メソッドを呼び出す
      oPoly.draw(ctx,canvasId,255,255);
    }else{
      ctx.fillText(&quot;正しい数値を指定してください&quot;,100,250);
    }
  }
  //函数を呼び出す
  drawPolygon(&quot;360regularConvexPolygon20220610&quot;);

  //イベント・リスナー
  const button1 = document.getElementById(&quot;btn20220610&quot;);
  button1.addEventListener(&quot;click&quot;,function(){
    drawPolygon(&quot;360regularConvexPolygon20220610&quot;)},false);

  //度数法と弧度法の誤差を比較する単位円を描く函数
  function degAndRad(canvasId){
    //HTML5 Canvasを利用
    const ctx = getCanvasContext(canvasId);
    
    let x = 110;
    let y = 110;
    const oArc = Arc();
    const oArrow = Arrow();

    oArc.setCenterX(x);
    oArc.setCenterY(y);
    oArc.setRadius(100);
    oArc.draw(ctx);
    oArrow.setColor(&quot;blue&quot;);
    oArrow.draw(ctx,x,y,60);
    oArrow.draw(ctx,x,y,120);
    oArrow.draw(ctx,x,y,180);
    oArrow.draw(ctx,x,y,240);
    oArrow.draw(ctx,x,y,300);
    oArrow.draw(ctx,x,y,360);
    oArrow.setColor(&quot;red&quot;);
    oArrow.draw(ctx,x,y,57.29577951308232);
    oArrow.draw(ctx,x,y,114.59155902616465);
    oArrow.draw(ctx,x,y,171.88733853924697);
    oArrow.draw(ctx,x,y,229.1831180523293);
    oArrow.draw(ctx,x,y,286.4788975654116);
    oArrow.draw(ctx,x,y,343.77467707849394);
  }
  degAndRad(&quot;degreesAndRadians20220610&quot;);

})(); //即時実行函数式の終わり
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/4695356769727712301/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2022/09/blog-post_20.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/4695356769727712301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/4695356769727712301'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2022/09/blog-post_20.html' title='角度とそれを測る単位系（度数法や弧度法等）を理解する'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-1191051104328294629</id><published>2022-09-19T21:35:00.020+09:00</published><updated>2025-03-19T02:53:50.275+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><title type='text'>JavaScriptで幾何学模様を描いてみた</title><content type='html'>&lt;p&gt;14個とも全て同じコードによって描いた。たった1つのパラメーターの値を変えるだけで同じコードから様々な幾何学的模様が作図できた。これらはその一部の例。&lt;/p&gt;
&lt;div style=&#39;text-align: center;&#39;&gt;
&lt;canvas id=&#39;spiralA&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralB&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralC&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralD&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralE&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralF&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralG&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralH&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralI&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralJ&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralK&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralL&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralM&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;canvas id=&#39;spiralN&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;なんで同一コードからこのように異なる模様が出来上がるのかは理解できない。ちょっと不思議。&lt;/p&gt;
&lt;fieldset id=&#39;spiralForm&#39;&gt;
&lt;legend&gt;幾何学模様を描く&lt;/legend&gt;
&lt;form&gt;
&lt;label&gt;1から360までの間の整数値を入力して描画ボタンを押してみてください：&lt;/label&gt;
&lt;input id=&#39;number1&#39; type=&#39;number&#39; max=&#39;360&#39; min=&#39;1&#39; value=&#39;1&#39; /&gt;
&lt;button id=&#39;button1&#39; type=&#39;button&#39;&gt;描画&lt;/button&gt;
&lt;/form&gt;
&lt;canvas id=&#39;spiralO&#39; width=&#39;350&#39; height=&#39;350&#39;&gt;
Canvas not supported
&lt;/canvas&gt;
&lt;script type=&#39;text/javascript&#39;&gt;
//即時実行函数式でスクリプト全体をローカル化
(function(){

  //渦巻きオブジェクトを返すファクトリ函数
  function Spiral(x,y){
    //プライベートなプロパティ
    let sideNumber = 500; //渦の長さ
    let sideAngle = 5; //線の角度間隔
    let radius = 1; //渦の中心半径
    let strokeColor = &#39;black&#39;; //線の色
    let scale = 3; //縮尺
    let handedness = -1; //渦の向き（正：時計回り、負：反時計回り）
    let originX = x; //座標系の原点になる水平座標
    let originY = y; //座標系の原点になる垂直座標

    //度数法から弧度法へ角度を変換する函数
    function toRadians(degree){
      return degree * (Math.PI/180.0);
    }

    /* 極座標（円座標）を直交座標へ変換する函数
      引数は極座標r,θ（θはラジアン表記） */
    function polarToCartesianX(r,radian){
      return r * Math.cos(radian);
    }
    function polarToCartesianY(r,radian){
      return r * Math.sin(radian);
    }

    //オブジェクト・リテラルを返す
    return {
      //アクセサー（セッター）
      setSideNumber : function(arg){sideNumber = arg;},
      setSideAngle : function(arg){sideAngle = arg;},
      setRadius : function(arg){radius = arg;},
      setStrokeColor : function(arg){strokeColor = arg;},
      //アクセサー（ゲッター）
      getSideNumber : function(){return sideNumber;},
      getSideRadius : function(){return sideAngle;},
      getRadius : function(){return radius;},

      //描画メソッド
      draw : function(canvasId){

        //HTML5 Canvasのインスタンス化
        const canvas = document.getElementById(canvasId);
        const ctx = canvas.getContext(&#39;2d&#39;);

        //画面をクリア
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        //この時点の状態を保存
        ctx.save();

        //座標系の原点を移動
        ctx.translate(originX,originY);

        //円弧のパス
        ctx.beginPath(); //初期化
        ctx.moveTo(originX+radius,originY); //線の始点
        //1から辺の数までの回数繰り返す
        for(let i = 1; i &lt;= sideNumber; i++){
          //角度を回数倍（負数で反時計回り）
          let angle = handedness * i * sideAngle;
          //増分を縮約（渦の間隔を制御）
          incremental = i * (1/scale);
          const x = originX + polarToCartesianX(
            radius+incremental, //半径＋増分
            toRadians(angle)); //水平座標を求める
          const y = originY + polarToCartesianY(
            radius+incremental, //半径＋増分
            toRadians(angle)); //垂直座標を求める
          ctx.lineTo(x,y);; //線のパスの座標を指定
        }
        ctx.strokeStyle = strokeColor; //線の色
        ctx.stroke(); //線を描く

        //save()で保存した状態を復元
        ctx.restore();   
      }
    };
  }
  
  //渦巻きオブジェクトを作成
  const spiral1 = Spiral(85,85);
  //描画メソッドを呼び出す
  spiral1.draw(&#39;spiralA&#39;);
  spiral1.setSideAngle(51);
  spiral1.draw(&#39;spiralB&#39;);
  spiral1.setSideAngle(150);
  spiral1.draw(&#39;spiralC&#39;);
  spiral1.setSideAngle(131);
  spiral1.draw(&#39;spiralD&#39;);
  spiral1.setSideAngle(89);
  spiral1.draw(&#39;spiralE&#39;);
  spiral1.setSideAngle(100);
  spiral1.draw(&#39;spiralF&#39;);
  spiral1.setSideAngle(179);
  spiral1.draw(&#39;spiralG&#39;);
  spiral1.setSideAngle(103);
  spiral1.draw(&#39;spiralH&#39;);
  spiral1.setSideAngle(108);
  spiral1.draw(&#39;spiralI&#39;);
  spiral1.setSideAngle(165);
  spiral1.draw(&#39;spiralJ&#39;);
  spiral1.setSideAngle(249);
  spiral1.draw(&#39;spiralK&#39;);
  spiral1.setSideAngle(48);
  spiral1.draw(&#39;spiralL&#39;);
  spiral1.setSideAngle(80);
  spiral1.draw(&#39;spiralM&#39;);
  spiral1.setSideAngle(154);
  spiral1.draw(&#39;spiralN&#39;);


  //スパイラル・アートを描くイベント・ハンドラー
  function spiralArt(){
    //HTML5 Canvasを利用
    const canvas = document.getElementById(&#39;spiralO&#39;);
    const ctx = canvas.getContext(&quot;2d&quot;);
    //画面をクリア
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    
    ctx.font = &quot;20px serif&quot;; //フォントの属性
    ctx.fillStyle = &quot;red&quot;; //塗りつぶす色

    //入力された値を取得して変数に代入
    const inputValue = document.getElementById(&#39;number1&#39;).value;

    //入力された値が正しい範囲内にあるかを検証して処理を分岐
    if (!isNaN(inputValue)){
      //入力された値を取得して数値に変換
      const inputAngle = parseInt(inputValue);
      if (inputAngle &gt;= 1 &amp;&amp; inputAngle &lt;= 360){
        //入力された値を渦巻きオブジェクトのプロパティに設定
        spiral1.setSideAngle(inputAngle);
        //渦巻きオブジェクトの描画メソッドを呼び出す
        spiral1.draw(&#39;spiralO&#39;);
      }else{
        ctx.fillText(&quot;正しい数値を指定してください&quot;,0,20);
      }
    }else{
      ctx.fillText(&quot;数値に変換できませんでした&quot;,0,20);
    }
  }

  //イベント・リスナー
  const button1 = document.getElementById(&#39;button1&#39;);
  button1.addEventListener(&#39;click&#39;,function(){
    spiralArt()},false);

})(); //即時実行函数式の終わり
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/1191051104328294629/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2022/09/javascript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/1191051104328294629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/1191051104328294629'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2022/09/javascript.html' title='JavaScriptで幾何学模様を描いてみた'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-5266812831987172429</id><published>2022-06-29T21:27:00.004+09:00</published><updated>2025-09-04T04:15:41.368+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="LibreOffice Basic"/><title type='text'>LibreOffice Basic ユーザーが定義するデータ型（構造体）</title><content type='html'>&lt;h4&gt;ユーザー定義のデータ型（構造体）&lt;/h4&gt;
&lt;p&gt;この投稿ではLibreOfficeかApache OpenOfficeのマクロ言語であるBasicにおいてユーザー定義のデータ型を宣言する2種類の方法について記す。&lt;/p&gt;
&lt;p&gt;ユーザー定義のデータ型はカスタム・データ型と呼ばれていることもある。それは型の違いに関わらず1つ以上の変数をまとめて1つのデータ型とし、そのデータ型に名前を付けたもの。その要素となる変数はメンバーと呼ばれている。&lt;/p&gt;
&lt;p&gt;ユーザー定義のデータ型はC言語で言うところの構造体、Pascalで言うところのレコードによく似ている。Pythonの辞書にも似ているが、辞書はハッシュ・テーブルの一種であると解釈されるものかもしれない。&lt;/p&gt;
&lt;p&gt;構造体やレコードとクラスとの違いは、構造体やレコードがデータ・プロパティだけを持ち、コード・プロパティを持たないこと。データ・プロパティとは単にプロパティと呼ばれていたりメンバー変数と呼ばれていたりするもの。コード・プロパティとはメソッドと呼ばれていたりメンバー函数と呼ばれていたりするもの。&lt;/p&gt;
&lt;p&gt;LibreOffice BasicまたはApache OpenOffice Basicでは、ユーザー定義のデー型（構造体）を次のような2種類の方法で定義することができる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type宣言を用いる方法。&lt;/li&gt;
&lt;li&gt;UNO(Universal Network Objects)を利用する方法。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Type宣言を用いて構造体を定義&lt;/h4&gt;
&lt;p&gt;モジュール内のサブルーチンの外にType宣言を記述することによって構造体を定義することができる。&lt;/p&gt;
&lt;p&gt;Type宣言はサブルーチンの外側に置く必要があり、Typeというキーワードによって始まり、End Typeというキーワードによって終わる。&lt;/p&gt;
&lt;p&gt;次の例では出版物の属性をひとまとまりにしたBooksという構造体を定義している。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;REM  ***** 構造体を定義 *****

&#39;VBA拡張
Option Compatible

&#39;Typeを用いた構造体宣言
Type Books
  BookTitle As String
  Subtitle As String
  Author As String
  Translator As String
  Publisher As String
  PublicationDate As Date
  PrintLength As Integer
  PriceYen As Integer
End Type
 
Sub Main
  &#39;インスタンス変数を宣言
  Dim books1 As Books
  &#39;データを代入
  books1.BookTitle = &quot;科学と仮説&quot;
  books1.Subtitle = void
  books1.Author = &quot;ポアンカレ&quot;
  books1.Translator = &quot;伊藤邦武&quot;
  books1.Publisher = &quot;岩波書店&quot;
  books1.PublicationDate = &quot;2021/12/17&quot;
  books1.PrintLength = 494
  books1.PriceYen = 1320

  &#39;メッセージボックスへ表示
  MsgBox(&quot;書籍：&quot; &amp;amp; books1.BookTitle &amp;amp; vbNewLine &amp;amp; _
   &quot;副題：&quot; &amp;amp; books1.Subtitle &amp;amp; vbNewLine &amp;amp; _
   &quot;著者：&quot; &amp;amp; books1.Author &amp;amp; vbNewLine &amp;amp; _
   &quot;翻訳：&quot; &amp;amp; books1.Translator &amp;amp; vbNewLine &amp;amp; _
   &quot;出版社：&quot; &amp;amp; books1.Publisher &amp;amp; vbNewLine &amp;amp; _
   &quot;発行日：&quot; &amp;amp; books1.PublicationDate &amp;amp; vbNewLine &amp;amp; _
   &quot;頁数：&quot; &amp;amp; books1.PrintLength &amp;amp; vbNewLine &amp;amp; _
   &quot;価格：&quot; &amp;amp; books1.PriceYen)
End Sub&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Option Compatibleという宣言はvbNewLineという文字列定数を使うために必要だった。&lt;/p&gt;
&lt;p&gt;Booksと名付けた構造体をType宣言によって定義した。&lt;/p&gt;
&lt;p&gt;例えば「Dim BookTitle As String」という文はString型としてBookTitleという名のメンバー変数（データ・プロパティ）を定義する」というような意味。&lt;/p&gt;
&lt;p&gt;Type宣言の後に置かれたMainというサブルーチンでは、まず構造体のBooksからbooks1というインスタンス変数を宣言し、次にその構造体の各メンバー（データ・プロパティ）に値を代入した。ここでは岩波書店から出版されているポアンカレの『科学と仮説』を例に挙げさせていただいた。&lt;/p&gt;
&lt;p&gt;voidは空の値を意味する。&lt;/p&gt;
&lt;p&gt;構造体に値を設定し終わったら、メッセージボックスにそれらを表示するようにした。文字列定数のvbNewLineは改行を意味している。&lt;/p&gt;
&lt;p&gt;ちなみにこのMainサブルーチンは、C言語のmain函数と違い、プログラムの開始点を必ずしも意味しない。つまりその存在は必須ではない。&lt;/p&gt;
&lt;p&gt;改行前のアンダーバー(_)はこの文が改行後も続くという意味。ただしこの例の場合、アンダーバーの前に空白を入れる必要があることに要注意。&lt;/p&gt;
&lt;h4&gt;PropertyValue UNO構造体を用いる方法&lt;/h4&gt;
&lt;p&gt;サブルーチンの外でType宣言を行う代わりにユニバーサル・ネットワーク・オブジェクト(UNO)のサービスであるcom.sun.star.beans.PropertyValueを利用しても構造体を定義することができる。&lt;/p&gt;
&lt;p&gt;ただし構造体のメンバーが複数ある場合、構造体に番号を振って順序付構造体にする必要がある。&lt;/p&gt;
&lt;p&gt;次の例では上述のコードと同様にBooksという構造体を定義した。&lt;/p&gt;
&lt;p&gt;Booksには配列のように8つの番号を付けて順序付構造体にした。0から数えるのでBooks(7)となる。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;REM ***** UNO構造体を定義 *****

Sub Main
  &#39;UNOを利用した構造体宣言
  Dim Books(7) As New com.sun.star.beans.PropertyValue
  &#39;各データ名を代入
  Books(0).Name = &quot;書籍&quot;
  Books(1).Name = &quot;副題&quot;
  Books(2).Name = &quot;著者&quot;
  Books(3).Name = &quot;翻訳者&quot;
  Books(4).Name = &quot;出版社&quot;
  Books(5).Name = &quot;発行日&quot;
  Books(6).Name = &quot;頁数&quot;
  Books(7).Name = &quot;価格&quot;

  &#39;各データを代入
  Books(0).Value = &quot;論理哲学論考&quot;
  Books(1).Value = void
  Books(2).Value = &quot;ウィトゲンシュタイン&quot;
  Books(3).Value = &quot;野矢茂樹&quot;
  Books(4).Value = &quot;岩波書店&quot;
  Books(5).Value = &quot;2003/8/20&quot;
  Books(6).Value = 256
  Books(7).Value = 858
  
  &#39;オブジェクト型変数を宣言
  Dim Doc,Sheet As Object
  Dim Cell1,Cell2 As Object
  
  &#39;現在のドキュメントのインスタンス変数
  Doc = ThisComponent
  &#39;シート&quot;Sheet1&quot;のインスタンス変数
  Sheet = Doc.Sheets.getByName(&quot;Sheet1&quot;)

  Dim i As Integer
  &#39;セルに1つずつ書き込むループ
  For i=0 To 7
    Cell1 = Sheet.getCellByPosition(0,i)  
    Cell1.String = Books(i).Name
    
    If i &amp;gt; 6 Then
      &#39;セルのインスタンス変数
      Cell2 = Sheet.getCellByPosition(1,i)
      &#39;データをセルに入力
      Cell2.string = Books(i).Value
    Else
      &#39;セルのインスタンス変数
      Cell2 = Sheet.getCellByPosition(1,i)
      &#39;データをセルに入力  
      Cell2.Value = Books(i).Value
    End If
  Next i
End Sub&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;UNOからインスタンス変数を宣言するためにはAsだけでなくNew演算子が必要。したがってAs Newとする必要がある。次のように代入演算子とNew演算子の組み合わせでも同じことができる。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;Books(7) = New com.sun.star.beans.PropertyValue&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;そして作成したインスタンス変数から.Nameに構造体の要素となるデータ・プロパティの識別子（名前）を代入した。&lt;/p&gt;
&lt;p&gt;その後に.Valueに各々のデータ・プロパティの値を代入した。ここでは岩波書店から出版されているウィトゲンシュタインの『論理哲学論考』を例に挙げさせていただいた。&lt;/p&gt;
&lt;p&gt;Calcの現在開いているドキュメントのシート&quot;Sheet1&quot;のセルに構造体の各データを入力するFor文を最後に記述した。&lt;/p&gt;
&lt;p&gt;現在のドキュメントと&quot;Sheet1&quot;というシートのインスタンス変数をそれぞれ宣言しておき、For文の中ではCell1とCell2というインスタンス変数を宣言してBooks(7)の.Nameと.Valueの値をそれらのセルに順番に入力していくコードを書いた。&lt;/p&gt;
&lt;p&gt;For文の中で用いたIf文は、文字列や日付の値をStringとして数値をValueとして区別してセルに入力するために使った。&lt;/p&gt;
&lt;p&gt;順序付構造体にしないと次のようなコードになってしまうかもしれない。やや冗長であり、エレガントではない。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;REM  ***** UNO構造体を定義 *****

Sub Main
  &#39;オブジェクト変数
  Dim BookTitle As New com.sun.star.beans.PropertyValue
  Dim BookSubtitle As New com.sun.star.beans.PropertyValue
  Dim BookAuthor As New com.sun.star.beans.PropertyValue
  Dim BookTranslator As New com.sun.star.beans.PropertyValue
  Dim Publisher As New com.sun.star.beans.PropertyValue
  Dim PublicationDate As New com.sun.star.beans.PropertyValue
  Dim PrintLength As New com.sun.star.beans.PropertyValue
  Dim PriceYen As New com.sun.star.beans.PropertyValue
  
  &#39;プロパティ名を定義
  BookTitle.Name = &quot;書籍&quot;
  BookSubtitle.Name = &quot;副題&quot;
  BookAuthor.Name = &quot;著者&quot;
  BookTranslator.Name = &quot;翻訳者&quot;
  Publisher.Name = &quot;岩波書店&quot;
  PublicationDate.Name = &quot;発行日&quot;
  PrintLength.Name = &quot;頁数&quot;
  PriceYen.Name = &quot;価格&quot;
  
  &#39;値を代入
  BookTitle.Value = &quot;科学と仮説&quot;
  BookSubtitle.Value = void
  BookAuthor.Value = &quot;ポアンカレ&quot;
  BookTranslator.Value = &quot;伊藤邦武&quot;
  Publisher.Value = &quot;岩波書店&quot;
  PublicationDate.Value = &quot;2021/12/17&quot; 
  PrintLength.Value = 494
  PriceYen.Value = 1320

  &#39;オブジェクト型変数を宣言
  Dim Doc,Sheet As Object
  Dim Cell1,Cell2 As Object
  
  &#39;現在のドキュメントのインスタンス変数
  Doc = ThisComponent
  &#39;シート&quot;Sheet1&quot;のインスタンス変数
  Sheet = Doc.Sheets.getByName(&quot;Sheet1&quot;)

  &#39;セルにプロパティ名を入力
  With Sheet
    .getCellByPosition(3,0).String = BookTitle.Name
    .getCellByPosition(3,1).String = BookSubtitle.Name
    .getCellByPosition(3,2).String = BookAuthor.Name
    .getCellByPosition(3,3).String = BookTranslator.Name
    .getCellByPosition(3,4).String = Publisher.Name
    .getCellByPosition(3,5).String = PublicationDate.Name
    .getCellByPosition(3,6).String = PrintLength.Name
    .getCellByPosition(3,7).String = PriceYen.Name
  End With
  &#39;セルに値を入力
  With Sheet
    .getCellByPosition(4,0).String = BookTitle.Value
    .getCellByPosition(4,1).String = BookSubtitle.Value
    .getCellByPosition(4,2).String = BookAuthor.Value
    .getCellByPosition(4,3).String = BookTranslator.Value
    .getCellByPosition(4,4).String = Publisher.Value
    .getCellByPosition(4,5).String = PublicationDate.Value
    .getCellByPosition(4,6).Value = PrintLength.Value
    .getCellByPosition(4,7).Value = PriceYen.Value
  End With
End Sub&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;関連記事：
&lt;li&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2019/08/libreoffice-basic_37.html&quot;&gt;LibreOffice Basic 変数 データ型 スコープ 定数 演算子 配列 構造体&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/5266812831987172429/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2022/06/libreoffice-basic.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/5266812831987172429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/5266812831987172429'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2022/06/libreoffice-basic.html' title='LibreOffice Basic ユーザーが定義するデータ型（構造体）'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-6766478387198393801</id><published>2022-06-23T19:54:00.011+09:00</published><updated>2025-09-04T06:40:52.068+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Canvas"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><category scheme="http://www.blogger.com/atom/ns#" term="数学"/><title type='text'>HTML5 Canvasで矢印を描いてみた（三角関数を利用）</title><content type='html'>&lt;p&gt;この投稿ではHTML5 Canvasの2次元コンテキストのAPIを利用して矢印を描くJavaScriptのコードを書いてみた。&lt;/p&gt;
&lt;p&gt;ここで描く図は次のようなもの。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;arrow20220613&quot; width=&quot;200&quot; height=&quot;230&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;たったこれだけ。にもかかわらずコードのほうはオブジェクト指向の体裁になるように汎用性を多少持たせてやや大げさに設計してみた。これを更に発展させれば低次元のベクトル空間を描けるものになるかもしれない。&lt;/p&gt;
&lt;h4&gt;HTMLのCanvas要素&lt;/h4&gt;
&lt;p&gt;矢印を描くためにHTML5 Canvasの2次元コンテキストのAPIを利用するので、HTML文書のbody要素内にCanvas要素を記述しておく必要があった。それは例えば次のようになる。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;canvas id=&quot;arrow&quot; width=&quot;250&quot; height=&quot;250&quot;&amp;gt;
このブラウザはHTML5 CanvasかJavaScritが有効ではありません。
&amp;lt;/canvas&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Canvasタグのid属性にはこのCanvas要素を一意に特定するための名前を指定する。ここではarrowとした。&lt;/p&gt;
&lt;p&gt;widthはキャンバスの幅。heightはキャンバスの高さ。&lt;/p&gt;
&lt;p&gt;HTML5 Canvasが有効でないときにはCanvasタグに挟まれた部分の文字列が表示される。&lt;/p&gt;
&lt;h4&gt;JavaScriptのコード&lt;/h4&gt;
&lt;p&gt;JavaScriptのコードはscriptタグで挟んだscript要素内に記述する。script要素はHTML文章のbody要素の後に置くことが望ましい。少なくともCanvas要素の後である必要がある。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;/body&amp;gt;
&amp;lt;script&amp;gt;
// JavaScriptのコード
&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;そうでなければ、例えばCanvas.jsと名付けた別のファイルに保存し、HTML文書内から次のように呼び出すこともできる。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;arrow.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;矢印オブジェクトを返すファクトリ函数&lt;/h4&gt;
&lt;p&gt;まず矢印オブジェクトを設計した。オブジェクト・リテラルを返すファクトリ&lt;ruby&gt;&lt;rb&gt;函数&lt;/rb&gt;&lt;rt&gt;かんすう&lt;/rt&gt;&lt;/ruby&gt;によって矢印オブジェクトを量産できるようにした。ファクトリ函数とはそれが呼び出されるとreturn文によってオブジェクト・リテラルを出力する特別な函数のこと。&lt;/p&gt;
&lt;p&gt;ファクトリ函数ではreturn文にオブジェクト・リテラルないしはオブジェクト・リテラルを指し示す変数を記述する。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//arrowオブジェクトを返すファクトリ函数
function arrow(){
   //プライベートなプロパティ
   return //オブジェクト・リテラル
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;オブジェクト・リテラルとは1つまたは複数のプロパティをその値と共に波括弧によって挟む記法。JavaScriptにはクラスの概念がなく、オブジェクトをリテラルとして直接表記することができる。その記法はPythonの辞書に近い。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;{プロパティ名:値, プロパティ名:値, メソッド名:匿名函数, メソッド名:匿名函数}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;プロパティはその値に匿名の函数を持つこともできる。値に函数を持つプロパティはコード・プロパティやメソッドと呼ばれている。メソッドも函数を値として持つプロパティの一種。&lt;/p&gt;
&lt;h4&gt;プライベートなプロパティ&lt;/h4&gt;
&lt;p&gt;JavaScriptにはprivateやpublicやprotectedといったアクセス修飾子がこれまでのところない。アクセス修飾子はオブジェクトや函数の外からのアクセスを許可するかどうかを決めるキーワード。&lt;/p&gt;
&lt;p&gt;その代わりにファクトリ函数ではreturn文によって返されるオブジェクト・リテラルの外に通常のローカル変数としてプロパティを記すことにより、それらのプロパティに対してオブジェクトの外から直接アクセスできないようにすることができる。&lt;/p&gt;
&lt;p&gt;次のコードは矢印オブジェクトを返すファクトリ函数のローカル変数として指定したプロパティ。これらのローカル変数はその函数（ファクトリ函数では結果的にオブジェクト）の外から直接アクセスできないため、プライベートなプロパティとして働く。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;function arrow(){

   //プライベートなプロパティとその値
  const ShaftTailX = 0; //幹末端の水平座標
  const ShaftTailY = 0; //幹末端の垂直座標
  let ShaftHeadX = 100; //幹先端の水平座標
  const ShaftHeadY = 0; //幹先端の垂直座標
  let headLength = 7; //鏃の長さ
  let headAngle = 160; //鏃の角度
  let arrowWidth = 1; //矢印の太さ
  let color = &quot;black&quot; //矢の色

  return //オブジェクト・リテラル
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ShaftTailXプロパティとShaftTailYプロパティは矢印の幹の末端部分のそれぞれ水平座標Xと垂直座標Yを表している。&lt;/p&gt;
&lt;p&gt;ShaftHeadXプロパティとShaftHeadYプロパティは矢印の幹の先端部分のそれぞれ水平座標Xと垂直座標Yを表している。&lt;/p&gt;
&lt;p&gt;ここで言うところの先端とは矢印の方向を指し示す&lt;ruby&gt;&lt;rb&gt;鏃&lt;/rb&gt;&lt;rt&gt;やじり&lt;/rt&gt;&lt;/ruby&gt;があるほうの端点を表し、末端とは鏃がないほうの端点を表している。&lt;/p&gt;
&lt;p&gt;それぞれの初期値はShaftTailXとShaftTailYを(0,0)とし、ShaftHeadXとShaftHeadYを(100,0)とした。&lt;/p&gt;
&lt;p&gt;ShaftHeadXプロパティの値が矢印の幹の長さを事実上決める。それ以外の座標を表すプロパティ（ローカル変数）は変更されては困る設計にしたので、constをそれらの前に置いて定数化した。&lt;/p&gt;
&lt;p&gt;ちなみにJavaScriptで変数の宣言を表すletとvarは函数の内部では同じ働きをするのでどちらを用いても構わない。&lt;/p&gt;
&lt;p&gt;これらのプロパティの初期値によって矢印の幹の部分だけを描くと次のように水平な直線になる。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;aLine20220613&quot; width=&quot;200&quot; height=&quot;15&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;headLengthプロパティは矢印の&lt;ruby&gt;&lt;rb&gt;鏃&lt;/rb&gt;&lt;rt&gt;やじり&lt;/rt&gt;&lt;/ruby&gt;の部分を構成する折れ曲がった2つの線分の長さを表すもの。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;anArrow20220613&quot; width=&quot;200&quot; height=&quot;15&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;headAngleプロパティは矢印の鏃を構成する折れ曲がった2つの線分の角度を表すもの。&lt;/p&gt;
&lt;p&gt;ただし鏃のこの角度の概念は常識的な直感にやや反しているかもしれないので、分かりやすくするために次の図によって角度ごとの鏃の状態の違いをならべて示してみた。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;arrowHead20220613&quot; width=&quot;200&quot; height=&quot;300&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;余談だけれど、Y字に似た二股の鏃を持った矢は実際に存在する。例えば音を出す&lt;ruby&gt;&lt;rb&gt;鏑&lt;/rb&gt;&lt;rt&gt;かぶら&lt;/rt&gt;&lt;/ruby&gt;が付いた鏑矢という狩りや儀式に用いられる矢があるが、その鏃にY字の形がよく見られる。&lt;/p&gt;
&lt;p&gt;arrowWidthプロパティは矢印の線の太さを表している。ただしこの値を大きくしすぎると、特に最後の例ではっきり分かるように鏃部分の形が崩れてしまう。矢印オブジェクト（を返すファクトリ函数）を設計する段階での改善の余地があるが、今回はこのまま。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;arrowWidth20220613&quot; width=&quot;200&quot; height=&quot;120&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;colorプロパティは文字通り矢印の色を表すもの。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;arrowColor20220613&quot; width=&quot;200&quot; height=&quot;70&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;h4&gt;オブジェクト・リテラルを返すreturn文&lt;/h4&gt;
&lt;p&gt;ファクトリ函数のローカル変数として記したプライベートなプロパティの後にはreturn文を置く。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//Arrowオブジェクトを返すファクトリ函数
function Arrow(){
   //プライベートなプロパティ

   //return文
   return{
     //プロパティ名:値,
     //プロパティ名:値,
     //メソッド名:匿名函数
   };
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;return文に置かれたプロパティとメソッドは、ファクトリ函数を介して作成されたオブジェクトの外部から直接アクセスすることができるので、オブジェクトの外に公開されたパブリックなものになる。&lt;/p&gt;
&lt;p&gt;オブジェクト・リテラルにはまず、オブジェクト指向プログラミングらしくアクセサー・メソッドを記した。アクセサー・メソッドとはプライベートなプロパティにアクセスするために専用に設けるメソッドのこと。ここでは設定用のアクセサー、すなわちセッターだけを記述した。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;function Arrow(){
  //プライベートなプロパティ

  //オブジェクト・リテラルを返す
  return {
    //パブリックなアクセサーメソッド（セッター）
    setArrowLength : function(arg){ShaftHeadX = arg},
    setHeadLength : function(arg){headLength = arg},
    setHeadAngle : function(arg){headAngle = arg},
    setArrowWidth : function(arg){arrowWidth = arg},
    setColor : function(arg){color = arg},
  };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ShaftHeadXプロパティの値が矢印の幹の長さを決めるため、そのアクセサー名はsetArrowLengthにした。&lt;/p&gt;
&lt;p&gt;アクセサー・メソッドの名前（識別子）はもちろん任意だけれども、セッターの場合は「setプロパティ名」と名付けられていることが多い。ちなみに取得用のゲッターの場合は「getプロパティ名」と名付けられていることが多い。&lt;/p&gt;
&lt;p&gt;各々の匿名函数の仮引数に指定したargはargumentの略で任意。parameterのparaとしても良かったのかもしれない。&lt;/p&gt;
&lt;p&gt;オブジェクト・リテラルのコーディングで間違え易いのはイコールではなくコロンでプロパティと値との間を区切ることと、文の終わりがセミコロンではなくカンマで区切ること。これらを間違えていたり忘れていたりすることがよくある。その際、文法エラーとなる。&lt;/p&gt;
&lt;p&gt;これらのアクセサー・メソッド（セッター）には見ての通り、値を外から受け取ってプライベートなプロパティに渡す以上の機能を持たせていない。&lt;/p&gt;
&lt;h4&gt;描画メソッド&lt;/h4&gt;
&lt;p&gt;アクセサー・メソッドの次に記したのは描画メソッド。メソッドの各々の仮引数にもコメントを付けるためにここではインデントと改行を使ったブロック記法で記述してみた。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;return{
  //アクセサー・メソッド
   
  draw : function(
    CanvasId, //Canvas要素のID属性
     x, //座標系の原点の水平座標
     y, //座標系の原点の垂直座標
     angle //座標系の回転角度
   ){
      //...
  }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このメソッドは引数としてHTMLのCanvas要素に設定したID属性と座標系の原点となる水平座標xと垂直座標y、そしてその座標系を原点を軸に回転させたときの角度angleを受け取ることにした。&lt;/p&gt;
&lt;h4&gt;スクリーン座標系&lt;/h4&gt;
&lt;p&gt;矢印を描く上で方眼紙として働く座標系の原点と角度については少し説明を要すると思う。&lt;/p&gt;
&lt;p&gt;HTML5 Canvasの2次元コンテキストで用いられる座標系はいわゆるスクリーン座標系と呼ばれているもの。スクリーン座標系はデフォルトでは左上端が(0,0)になり、下に向かうほど、または右に向かうほどそれらの値が大きくなる。&lt;/p&gt;
&lt;p&gt;スクリーン座標系は次のようにデカルト座標系が逆立ちしたような構造になっている。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;screenCoordinate20220613&quot; width=&quot;210&quot; height=&quot;220&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;HTML5 Canvasのtranslate()というメソッドを使うとスクリーン座標系の原点(0,0)を移動できる。&lt;/p&gt;
&lt;p&gt;HTML5 Canvasのrotate()というメソッドを使えば引数に角度を指定することによってそのスクリーン座標系をその原点を軸にして回転移動させることができる。ただし角度は弧度法（ラジアン）で指定する必要がある。&lt;/p&gt;
&lt;p&gt;スクリーン座標系の原点の位置が動くとその上に描かれた矢印も動くので、これによって矢印を描く位置を変えることができる。スクリーン座標系を回転移動させるとその上に描かれた矢印も回転移動するので、これによって矢印の向きを変えることができる。&lt;/p&gt;
&lt;p&gt;描画メソッドdraw()の仮引数にあるxとyは座標系の原点の位置を決め、translate()メソッドの引数として使う。&lt;/p&gt;
&lt;p&gt;描画メソッドdraw()の仮引数にあるangleは座標系の角度を決め、rotate()メソッドの引数として使う。&lt;/p&gt;
&lt;p&gt;次に描画メソッドdraw()の中身について記す。&lt;/p&gt;
&lt;p&gt;まずはHTML5 Canvasの2次元コンテキストのAPIを利用するためのお決まりの文。描画メソッドの仮引数の1つCanvasIdはHTMLの特定のCanvas要素を取得するためにここで使う。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//HTML5 Canvas 2DのAPIを利用する準備
const Canvas = document.getElementById(CanvasId);
const Ctx = Canvas.getContext(&quot;2d&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;スクリーン座標系の状態の保存と復元&lt;/h4&gt;
&lt;p&gt;translate()を使って原点を移動させる前にスクリーン座標系のデフォルト状態を保存しておく必要がある。それにはHTML5 Canvasのsave()というメソッドを利用する。そして描画メソッドの終わりでrestore()というメソッドを呼び出し、save()メソッドによって保存しておいた状態を復元する。&lt;/p&gt;
&lt;p&gt;この保存と復元の手続きを省くと描画メソッドを繰り返し呼び出したときに想定外の副作用が生じてしまう。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;draw : function(CanvasId,x,y,angle){
  //HTML5 Canvas 2DのAPIを利用する準備
  const Canvas = document.getElementById(CanvasId);
  const Ctx = Canvas.getContext(&quot;2d&quot;);

  //この時点の状態を保存
  Ctx.save();

  //...

  //save()で保存した状態を復元 
  Ctx.restore();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;save()メソッドでスクリーン座標系のデフォルト状態を保存した後、translate()メソッドによって原点を移動させる処理をする。その仮引数となるx（水平座標）とy（垂直座標）にはこの描画メソッドであるdraw()を呼び出すときに受け取る引数の水平座標xと垂直座標yが収まる。&lt;/p&gt;
&lt;p&gt;そしてrotate()メソッドによって原点を軸にしてスクリーン座標系を回転移動させる。draw()を呼び出すときに受け取る引数のangleがrotate()メソッドの引数に収まる。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//この時点の状態を保存
Ctx.save();

//スクリーン座標系の原点を移動
Ctx.translate(x,y);
//スクリーン座標系を回転移動
Ctx.rotate(-1 * toRadians(angle));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rotate()メソッドの引数に与える角度はラジアンという単位である必要があるのでtoRadians()函数を呼び出して度数法を弧度法に変換させるようにした。このtoRadians()函数は自作したもの。&lt;/p&gt;
&lt;p&gt;更にそこで-1を掛けているのは、角度の値の正負の符号を反転させ、角度が反時計回りに計られるようにしたため。これをしないと反時計回りに計られる通常の角度とは違い、なぜだか時計回りに角度が計られてしまうので、angleに値を渡すときに混乱すると思う。&lt;/p&gt;
&lt;p&gt;次にHTML5 Canvasの2次元コンテキストのAPIを利用して矢印の幹に当たる直線を描くコードを書く。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//矢印の幹の直線を描く
Ctx.beginPath(); //パスの初期化
Ctx.lineWidth = arrowWidth; //線の太さ
Ctx.strokeStyle = color; //線の色
Ctx.moveTo(shaftTailX, shaftTailY); //線の始点座標
Ctx.lineTo(ShaftHeadX, ShaftHeadY); //線の終点座標
Ctx.stroke(); //パスに従って直線を描く&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;線を描く通り道（パス）をbeginPath()メソッドによってまずは初期化しておく必要がある。&lt;/p&gt;
&lt;p&gt;HTML5 CanvasのlineWidthプロパティに線の太さを表すために用意しておいたarrowWidthプロパティの値を代入。&lt;/p&gt;
&lt;p&gt;HTML5 CanvasのstrokeStyleプロパティに線の色を表すために用意しておいたcolorプロパティの値を代入。&lt;/p&gt;
&lt;p&gt;線の始点となる水平座標と垂直座標をHTML5 CanvasのmoveTo()メソッドの引数に代入。&lt;/p&gt;
&lt;p&gt;線の終点となる水平座標と垂直座標をHTML5 CanvasのlineTo()メソッドの引数に代入。&lt;/p&gt;
&lt;p&gt;線の通り道（パス）が決まったところでHTML5 Canvasのstroke()メソッドを呼び出して直線を描く。&lt;/p&gt;
&lt;p&gt;次に描くのは矢印の鏃を形作るために矢印の先端から少し角度を変えて伸びる2つの線分。&lt;/p&gt;
&lt;p&gt;この鏃の部分を描くのに今回は数学的な技術をちょっとだけ使ってみた。こうする必要はなかったのだけれども数学的技術を導入することで鏃の長さや角度を自由に変えられるように汎用性を多少与えてみた。&lt;/p&gt;
&lt;h4&gt;数学的な変換を行う函数&lt;/h4&gt;
&lt;p&gt;数学的手続き（アルゴリズム）に汎用性を持たせるためにそれらを独立した3つの函数として宣言した。&lt;/p&gt;
&lt;p&gt;その1つが角度を度数法の単位から弧度法の単位へと変換する函数であるtoRadians()。度数法の値dを弧度法の値rへ変換するための公式は例えば次のとおり。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ r = \dfrac{\pi d}{180} \]&lt;/div&gt;
&lt;p&gt;度数法の値に円周率πを掛けてその解を180で割るという簡単な計算。&lt;/p&gt;
&lt;p&gt;ラジアンは弧度法という角度の測定法に基づいた角度の単位のこと。弧度法では円の半径の長さを1ラジアンとして円弧の距離を測り、反時計回りに半回転するとちょうど円周率πと同じ値になる。反時計回りに一回転するとちょうど円周率πの2倍になる。つまり度数法での180度がπになり、360度が2πになる。&lt;/p&gt;
&lt;p&gt;この函数は入力値として度数法の値degreeを受け取り、上の式による計算をした後、その解である弧度法の値radianを出力する。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ rdian = f(degree) \]&lt;/div&gt;
&lt;p&gt;この函数をJavaScriptで表すと例えば次のようになる。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//度数法を弧度法に変換する函数
function toRadians(degree){
  return degree * (Math.PI/180.0);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;残りの2つの函数は2次元平面の極座標系である円座標系を直交座標系に変換するもの。円座標系は半径の長さと角度で定義された座標系であるので、この座標系を直交座標系に変換すれば線分の長さと角度から直交座標系での座標(x,y)を得ることができる。&lt;/p&gt;
&lt;p&gt;線分の長さをr、水平座標をx、垂直座標をy、角度を&lt;ruby&gt;&lt;rb&gt;θ&lt;/rb&gt;&lt;rt&gt;シータ&lt;/rt&gt;&lt;/ruby&gt;とすると、円座標から直交座標への変換は次のような式に表すことができる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ x = r \cos\theta \]
\[ y = r \sin\theta \]&lt;/div&gt;
&lt;p&gt;要するに、直交座標系での水平座標xは原点までの直線距離を斜辺rとする直角三角形の余弦函数\( \cos\theta \)の出力値をr倍したものに等しく、垂直座標yはその正弦函数\( \sin\theta \)の出力値をr倍したものに等しい。&lt;/p&gt;
&lt;p&gt;ここで三角函数（三角比）についてのちょっとしたおさらい。&lt;/p&gt;
&lt;p&gt;三角函数と呼ばれているものは実は三角法函数のことであり、その言葉通りに三角法に基づいている。語源を辿ると三角形測量函数と呼ぶこともできる。&lt;/p&gt;
&lt;p&gt;三角法を用いると直接には測量できない物の長さや区間の距離を推定することができる。&lt;/p&gt;
&lt;p&gt;三角法を理解するためには次のように半径を1とする単位円に基づいて描いた座標系を理解するのが良い方法であると思う。次の図は2次元平面の直交座標系と2次元平面の極座標系である円座標系とを重ね合わせるように描いたもの。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;coordinateA20220613&quot; width=&quot;400&quot; height=&quot;220&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;coordinateB20220613&quot; width=&quot;400&quot; height=&quot;220&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\[ r = \overline{PO} \]
\[ \angle{PHO} = 90^\circ \]
&lt;/div&gt;
&lt;p&gt;上の図では点線の\( \overline{PH} \)が直角三角形の対辺であると同時に直交座標系のy座標に相当し、\( \overline{OH} \)が直角三角形の隣辺であると同時に直交座標系のx座標に相当することに注目。&lt;/p&gt;
&lt;p&gt;三角法で重要なのは時計の針が時刻3時の始点から反時計回りにどれだけ回転移動した位置にあるかということ。その角度θが常に直角三角形の内角になるとは限らない。角度θが度数法で90度を超えると、すなわち&lt;ruby&gt;&lt;rb&gt;鈍角&lt;/rb&gt;&lt;rt&gt;どんかく&lt;/rt&gt;&lt;/ruby&gt;になると、直角三角形の内角ではなくなる。&lt;/p&gt;
&lt;p&gt;三角法は直角三角形によって特徴付けられているよりは直交座標系と極座標系（円座標系）との互換性によって特徴付けられている。&lt;/p&gt;
&lt;p&gt;ちなみに極座標系とは半径rと角度座標θから位置を定める次のような座標系のこと。極座標系では原点は極と呼ばれており、半径rは&lt;ruby&gt;&lt;rb&gt;動径&lt;/rb&gt;&lt;rt&gt;どうけい&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;polarCoordinate20220613&quot; width=&quot;250&quot; height=&quot;160&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;三角法函数とは、角度θの値を決めてやると、点Pのx座標とy座標と半径（動径）rの長さとのいずれかの2対を取り出したときのその比率が一意に定まる関係を意味している。&lt;/p&gt;
&lt;p&gt;各々の入力の値の集合に応じて出力の値が常に一定になるので函数と見なすことができる。同じ入力値を与えているのにその度に一定しない気まぐれな出力値が返ってくるようだとそれを函数と見なすことはできない。函数とは入力値と出力値との間の因果関係がはっきりしている関係であると考えることができる。&lt;/p&gt;
&lt;p&gt;頻繁に使われる最も代表的でかつ汎用性を持った三角法函数は3種類あり、ここではその内の2種類を利用する。その2種類とは&lt;ruby&gt;&lt;rb&gt;正弦&lt;/rb&gt;&lt;rt&gt;せいげん&lt;/rt&gt;&lt;/ruby&gt;函数（サイン）と&lt;ruby&gt;&lt;rb&gt;余弦&lt;/rb&gt;&lt;rt&gt;よげん&lt;/rt&gt;&lt;/ruby&gt;函数（コサイン）。ちなみに残りの1種類は&lt;ruby&gt;&lt;rb&gt;正接&lt;/rb&gt;&lt;rt&gt;せいせつ&lt;/rt&gt;&lt;/ruby&gt;函数（タンジェント）。&lt;/p&gt;
&lt;p&gt;数学的な表記法では、正弦函数は\( \sin\theta \)、余弦函数は\( \cos\theta \)、正接函数は\( \tan\theta \)と表されることが多いが、角度θは三角法函数の仮引数となる変数であるので、コンピューター・プログラミングに馴染みのある人にとってはsin(θ)、cos(θ)、tan(θ)と表記したほうが分かりやすい。&lt;/p&gt;
&lt;p&gt;正弦函数は角度θが与えられたときに斜辺に対して対辺がどのくらいの比率になるのかを示している。余弦函数は角度θが与えられたときに斜辺に対して隣辺がどのくらいの比率になるのかを示している。&lt;/p&gt;
&lt;div class=&quot;note&quot;&gt;
&lt;dl&gt;
&lt;dt&gt;正弦函数 \( \sin\theta \)&lt;/dt&gt;
&lt;dd&gt;角度θを引数として入力したとき、正弦函数は直角三角形の斜辺の長さに対する対辺の長さの割合（比率）を出力する。\[ \sin\theta = \dfrac{\text{対辺}}{\text{斜辺}} \]&lt;/dd&gt;
&lt;dd&gt;もしくは円の半径rに対する点Pのy座標の割合（比率）を出力する。\[ \sin\theta = \dfrac{y座標}{半径r} \]&lt;/dd&gt;
&lt;dd&gt;したがってこのことは、正弦函数が出力した比率に斜辺の長さ（半径r）を掛ければ対辺の長さ（y座標）が得られることを意味している。\[ \text{対辺} = \text{斜辺} \times \sin\theta \] \[ y\text{座標} = \text{半径}r \times \sin\theta \]&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;余弦函数 \( \cos\theta \)&lt;/dt&gt;
&lt;dd&gt;角度θを引数として入力したとき、余弦函数は直角三角形の斜辺の長さに対する隣辺の長さの割合（比率）を出力する。\[ \cos\theta = \dfrac{\text{隣辺}}{\text{斜辺}} \]&lt;/dd&gt;
&lt;dd&gt;もしくは円の半径rに対する点Pのx座標の割合（比率）を出力する。\[ \cos\theta = \dfrac{x座標}{半径r} \]&lt;/dd&gt;
&lt;dd&gt;したがってこのことは、余弦函数が出力した比率に斜辺の長さ（半径r）を掛ければ隣辺の長さ（x座標）が得られることを意味している。\[ \text{隣辺} = \text{斜辺} \times \cos\theta \] \[ x\text{座標} = \text{半径}r \times \cos\theta \]&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;正接函数 \( \tan\theta \)&lt;/dt&gt;
&lt;dd&gt;角度θを引数として入力したとき、正接函数は直角三角形の隣辺の長さに対する対辺の長さの割合（比率）を出力する。\[ \tan\theta = \dfrac{\text{対辺}}{\text{隣辺}} \]&lt;/dd&gt;
&lt;dd&gt;もしくは点Pのx座標に対するy座標の割合（比率）を出力する。\[ \tan\theta = \dfrac{y\text{座標}}{x\text{座標}} \]&lt;/dd&gt;
&lt;dd&gt;したがってこのことは、正接函数が出力した比率に隣辺の長さ（x座標）を掛ければ対辺の長さ（y座標）が得られることを意味している。\[ \text{対辺} = \text{隣辺} \times \tan\theta \] \[ y\text{座標} = x\text{座標} \times \tan\theta \]&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;p&gt;要するに、斜辺の長さ（半径rまたは動径r）と角度θが分かっているとき、正弦函数によって対辺の長さ（y座標）を計算でき、余弦函数によって隣辺の長さ（x座標）を計算することができる。&lt;/p&gt;
&lt;p&gt;そういう訳で正弦函数と余弦函数を利用すると極座標系（円座標系）を直交座標系に変換することができる。&lt;/p&gt;
&lt;p&gt;極座標から直交座標への変換を式にして表すと例えば次のようになる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align}
(r,\theta) \rightarrow (x,y)
&amp;amp;= \left( r \times \dfrac{\overline{OH}}{\overline{OP}},
r \times \dfrac{\overline{PH}}{\overline{OP}} \right) \\
&amp;amp;= (r\cos\theta,r\sin\theta)
\end{align}&lt;/div&gt;
&lt;p&gt;これをJavaScriptの函数にしてみると次のように書けると思う。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;/* 極座標（円座標）を直交座標へ変換する函数
引数は極座標r,θ（θの単位はラジアン） */
function polarToCartesianX(r,radian){
  return r * Math.cos(radian);
}
function polarToCartesianY(r,radian){
  return r * Math.sin(radian);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;x座標（水平座標）を返す函数とy座標（垂直座標）を返す函数の2つを宣言した。それぞれpolarToCartesianX()とpolarToCartesianY()と名付けた。&lt;/p&gt;
&lt;p&gt;これらの函数内では余弦函数と正弦函数を記すためにJavaScriptの組み込みメソッドであるMath.cos()とMath.sin()を利用した。&lt;/p&gt;
&lt;p&gt;以上の3つの函数はどこからでも自由に呼び出せるように特定の函数や特定のオブジェクトの内部に閉じ込めず、外に置いてグローバル・スコープにした。&lt;/p&gt;
&lt;h4&gt;矢印の鏃の部分を描く方法&lt;/h4&gt;
&lt;p&gt;矢印オブジェクトを返すファクトリ函数に話を戻す。そのreturn文によって返すオブジェクト・リテラルの中に記したdrawという描画メソッドの続き。&lt;/p&gt;
&lt;p&gt;HTML5 Canvasの2次元コンテキストのAPIを利用して矢印の幹の部分の次に描くのは&lt;ruby&gt;&lt;rb&gt;鏃&lt;/rb&gt;&lt;rt&gt;やじり&lt;/rt&gt;&lt;/ruby&gt;の部分。その線分の長さと角度を変えられるように汎用性を若干与える設計をした。&lt;/p&gt;
&lt;p&gt;矢の幹の先端から上下対称（左右対称）に両側に伸びる2つの線分を描く。始点は矢の幹の先端だとして、終点になる座標はそれらの線分の長さと角度から相対的に計算するようにした。&lt;/p&gt;
&lt;p&gt;それらのコードは次のようになった。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;draw : function(CanvasId,x,y,angle){
  //...

  //鏃の相対的座標を計算して各変数に代入
  const HeadLeftWingX = polarToCartesianX(headLength,
    toRadians(headAngle)) + ShaftHeadX;
  const HeadLeftWingY = polarToCartesianY(headLength,
    toRadians(headAngle)) + ShaftHeadY;
  const HeadRightWingX = polarToCartesianX(headLength,
    toRadians(-1 * headAngle)) + ShaftHeadX;
  const HeadRightWingY = polarToCartesianY(headLength,
    toRadians(-1 * headAngle)) + ShaftHeadY;

//...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;鏃を形作る2本の線分のそれぞれ終点を表す座標を入れるために、HeadLeftWingXとHeadLeftWingY、そしてHeadRightWingXとHeadRightWingYという4つの変数を用意した。Xが水平座標、Yが垂直座標。&lt;/p&gt;
&lt;p&gt;鏃を形作る2本の線分の終点を表す座標をその角度とその長さから相対的に決めるために極座標系（円座標系）を直交座標系に変換する2つの函数を呼び出して利用した。線分の長さと角度を引数として渡すと水平座標xを出力するpolarToCartesianX()と、同様に引数を与えると垂直座標yを出力するpolarToCartesianY()がそれら。&lt;/p&gt;
&lt;p&gt;極座標系（円座標系）を直交座標系に変換するこれら2つの函数には鏃を形作る線分の長さを表すheadLengthと角度を表すheadAngleという引数を変数で与えている。ただし線分のもう片方に与える角度には-1を掛けて負数し、時計回りに角度を指定する必要があった。&lt;/p&gt;
&lt;p&gt;これらの2つの函数に与える角度は弧度法で指定する必要があるので、同じく自作したtoRadians()函数を呼び出して利用した。&lt;/p&gt;
&lt;p&gt;しかしこれだけだとまだ思ったところに鏃が描画されず、鏃が異常に伸びてしまったので、極座標を直交座標に変換する函数が返した値に矢印の幹の先端の水平座標を表すShaftHeadXの値を更に加算する必要があった。&lt;/p&gt;
&lt;p&gt;これで鏃を描く準備が整った。&lt;/p&gt;
&lt;p&gt;次のコードは鏃の部分をHTML5 Canvasの2次元コテンテキストのAIPを利用して描画するもの。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;draw : function(CanvasId,x,y,angle){
  //...

  //鏃を描く
  Ctx.beginPath(); //パスの初期化

  //パスの指定
  Ctx.moveTo(ShaftHeadX, ShaftHeadY);
  Ctx.lineTo(HeadLeftWingX, HeadLeftWingY);
  Ctx.moveTo(ShaftHeadX, ShaftHeadY);
  Ctx.lineTo(HeadRightWingX, HeadRightWingY);

  Ctx.stroke(); //描画

  //...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;まずHTML5 CanvasのbeginPath()メソッドによってパスを初期化。&lt;/p&gt;
&lt;p&gt;次にHTML5 CanvasのmoveTo()メソッドに鏃を形作る線分の始点となる座標を与えた。つまり鏃の幹の先端の座標が入ることになるShaftHeadXとShaftHeadY。&lt;/p&gt;
&lt;p&gt;HTML5 CanvasのlineTo()メソッドの引数には鏃を形作る線分の終点となる座標を与えた。極座標を直交座標に変換する2つの函数であるpolarToCartesianX()またはpolarToCartesianY()を呼び出して計算する相対的座標を入れる4つの変数はここで使った。&lt;/p&gt;
&lt;p&gt;こうしておいてHTML5 Canvasのstroke()メソッドを呼び出して鏃を描画させるようにした。&lt;/p&gt;
&lt;p&gt;最後にrestore()メソッドを呼び出してsave()メソッドで保存しておいたスクリーン座標系の元の状態を復元すれば波括弧でブロックを閉じてdrawメソッドは完成。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//save()で保存した状態を復元
Ctx.restore();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これで矢印オブジェクトを返すファクトリ函数も波括弧でブロックを閉じれば完成する。&lt;/p&gt;
&lt;p&gt;矢印オブジェクト・リテラルを返すファクトリ函数Arrowのコード全体は次のようになる。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//Arrowオブジェクトを返すファクトリ函数
function Arrow(){

  //プライベートなプロパティ
  const shaftTailX = 0; //幹末端の水平座標
  const shaftTailY = 0; //幹末端の垂直座標
  let ShaftHeadX = 100; //幹先端の水平座標
  const ShaftHeadY = 0; //幹先端の垂直座標
  let headLength = 7; //鏃の長さ
  let headAngle = 160; //鏃の角度
  let arrowWidth = 1; //矢印の太さ
  let color = &quot;black&quot; //矢の色

  //オブジェクト・リテラルを返す
  return{
    //パブリックなアクセサーメソッド（セッター）
    setArrowLength : function(arg){ShaftHeadX = arg},
    setHeadLength : function(arg){headLength = arg},
    setHeadAngle : function(arg){headAngle = arg},
    setArrowWidth : function(arg){arrowWidth = arg},
    setColor : function(arg){color = arg},

    /*描画メソッド：
    引数はCanvas要素のIDと描画座標と描画角度*/
    draw : function(CanvasId,x,y,angle){

      //HTML5Canvas2DのAPIを利用する準備
      const Canvas = document.getElementById(CanvasId);
      const Ctx = Canvas.getContext(&quot;2d&quot;);

      //この時点の状態を保存
      Ctx.save();

      //座標系の原点を移動
      Ctx.translate(x,y);
      /* 座標系を原点を軸に回転移動
        かつ正負を反転させて反時計回りに */
      Ctx.rotate(toRadians(-1 * angle));

      //矢印の幹の直線を描く
      Ctx.beginPath();
      Ctx.lineWidth = arrowWidth;
      Ctx.strokeStyle = color;
      Ctx.moveTo(shaftTailX,shaftTailY);
      Ctx.lineTo(ShaftHeadX,ShaftHeadY);
      Ctx.stroke();

      //鏃の部分を描く

      //鏃の相対的座標を計算して各変数に代入
      const HeadLeftWingX = polarToCartesianX(headLength,
        toRadians(headAngle)) + ShaftHeadX;
      const HeadLeftWingY = polarToCartesianY(headLength,
        toRadians(headAngle)) + ShaftHeadY;
      const HeadRightWingX = polarToCartesianX(headLength,
        toRadians(-1 * headAngle)) + ShaftHeadX;
      const HeadRightWingY = polarToCartesianY(headLength,
        toRadians(-1 * headAngle)) + ShaftHeadY;

      //鏃を描く
      Ctx.beginPath();
      Ctx.moveTo(ShaftHeadX,ShaftHeadY);
      Ctx.lineTo(HeadLeftWingX,HeadLeftWingY);
      Ctx.moveTo(ShaftHeadX,ShaftHeadY);
      Ctx.lineTo(HeadRightWingX,HeadRightWingY);
      Ctx.stroke();

      //save()で保存した状態を復元
      Ctx.restore();
    }
  };
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;ラベル・オブジェクトを返すファクトリ函数&lt;/h4&gt;
&lt;p&gt;矢印になんらかのラベル付けを行いたかったのでラベル・オブジェクトを返すファクトリ函数も作ってみた。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//ラベル・オブジェクトを返すファクトリ函数
function Label(){

  //プライベートなプロパティ
  let font = &quot;15px serif&quot;; //フォント属性
  let color = &quot;black&quot;; //文字の色
  let align = &quot;center&quot;; //文字の水平位置
  let baseline = &quot;middle&quot;; //文字の垂直位置

  //オブジェクト・リテラルを返す
  return {

    //アクセサー（セッター）
    setFont : function(arg){font = arg;},
    setColor : function(arg){color = arg;},
    setAlign : function(arg){align = arg;},
    setBaseline : function(arg){baseline = arg;},

    //描画メソッド（ID,文字,x座標,y座標,最大文字幅）
    draw : function(CanvasId,text,x,y,largestWidth){

    //HTML5 Canvas 2DのAPIを利用するための準備
    const Canvas = document.getElementById(CanvasId);
    const Ctx = Canvas.getContext(&quot;2d&quot;);

    //文字列を描画する
    Ctx.font = font; //フォント
    Ctx.strokeStyle = color; //色
    Ctx.textAlign = align; //文字の整列
    Ctx.textBaseline = baseline; //
     //文字を描画
    Ctx.fillText(text,x,y,largestWidth);
    }
  };
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;fontプロパティの15pxが文字の大きさを意味している。&lt;/p&gt;
&lt;p&gt;それらのプロパティはプライベート領域に置いてローカル変数にし、アクセサー・メソッドのセッターを介して値を変更できるようにした。&lt;/p&gt;
&lt;p&gt;そしてdrawメソッドではHTML5 Canvasの2次元コンテキストのAPIを呼び出して指定した座標にラベル付けする文字列を描画できるようにした。&lt;/p&gt;
&lt;h4&gt;オブジェクトの生産と利用&lt;/h4&gt;
&lt;p&gt;ファクトリ函数はオブジェクト量産機なので、これを呼び出して任意の変数に代入すれば、オブジェクト（インスタンス変数）を次々に作り出すことができる。&lt;/p&gt;
&lt;p&gt;描きたいのは色違いの3つの矢印なので、3つのインスタンス変数を宣言して3つの矢印オブジェクトを生産することにした。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//矢印オブジェクトを生産
const arrow1 = Arrow();
const arrow2 = Arrow();
const arrow3 = Arrow();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ファクトリ函数が返すのはオブジェクト・リテラルであるので、コンストラクター函数やクラス函数と違い、new演算子を代入演算子と一緒にそこで用いないことに注意。&lt;/p&gt;
&lt;p&gt;で、ここで生産した矢印オブジェクトのインスタンス変数のdrawメソッドを呼び出して矢印を描いてみた。&lt;/p&gt;
&lt;p&gt;drawメソッドの引数には、第1にCanvas要素のID属性、第2に描画位置を表すx座標、第3に描画一を表すy座標、第3にその角度を渡す必要がある。&lt;/p&gt;
&lt;p&gt;ただし描画位置の座標は矢印の末端（尾部）の位置を表す。&lt;/p&gt;
&lt;p&gt;角度の値を正数にすると反時計回りに角度を計り、負数にすると時計回りに角度を計る。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//矢印オブジェクトの生産
const arrow5 = Arrow();
const arrow6 = Arrow();
const arrow7 = Arrow();

//セッターを呼び出して色を設定
arrow5.setColor(&quot;green&quot;);
arrow6.setColor(&quot;#ff00ff&quot;);
arrow7.setColor(&quot;rgb(0,128,128)&quot;);

//描画メソッドを呼び出して描画
//引数はCanvas要素ID,x座標,y座標,角度
arrow5.draw(&quot;arrow&quot;,100,100,0);
arrow6.draw(&quot;arrow&quot;,100,100,150);
arrow7.draw(&quot;arrow&quot;,100,100,-90);&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas class=&quot;frame&quot; id=&quot;arrowsA20220613&quot; width=&quot;200&quot; height=&quot;230&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;矢印の長さを変更するには矢印オブジェクトのセッターsetArrowLength()メソッドを呼び出す。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//矢印の長さを変更
arrow5.setArrowLength(200);
arrow6.setArrowLength(200);

//描画メソッドdrawを呼び出して矢印を描画
arrow5.draw(&quot;arrow&quot;,0,100,0);
arrow6.draw(&quot;arrow&quot;,100,200,90);
arrow7.draw(&quot;arrow&quot;,100,100,45);&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas class=&quot;frame&quot; id=&quot;arrowsB20220613&quot; width=&quot;200&quot; height=&quot;230&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;鏃の長さを変更するには矢印オブジェクトのセッターsetHeadlength()を呼び出す。&lt;/p&gt;
&lt;p&gt;鏃の角度を変更するには矢印オブジェクトのセッターsetHeadAngle()を呼び出す。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//矢印オブジェクトを生産
const arrow8 = Arrow();
const arrow9 = Arrow();
const arrow10 = Arrow();

//鏃の長さを変更
arrow8.setHeadLength(20);
arrow9.setHeadLength(30);
arrow10.setHeadLength(50);
  
//鏃の角度を変更
arrow8.setHeadAngle(45);
arrow9.setHeadAngle(90);
arrow10.setHeadAngle(150);

//矢印を描画
arrow8.draw(&quot;arrow&quot;,0,30,0);
arrow9.draw(&quot;arrow&quot;,0,100,0);
arrow10.draw(&quot;arrow&quot;,0,180,0);&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas class=&quot;frame&quot; id=&quot;arrowsC20220613&quot; width=&quot;200&quot; height=&quot;230&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;各々の矢印にx,y,zのラベル付けを行いたい場合、ラベル・オブジェクトを返すファクトリ函数Levelを呼び出して利用する。&lt;/p&gt;
&lt;p&gt;ラベル・オブジェクトの描画メソッドdrawの引数には、第1にCanvas要素のID、第2にラベルの文字列、第3にラベルを描く位置のx座標、第4にラベルを描く位置のy座標、第5にラベルの最大幅を渡す。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;//矢印オブジェクトを生産
const arrow11 = Arrow();
const arrow12 = Arrow();
const arrow13 = Arrow();

/* 色設定メソッドを呼び出して矢の色を指定し、
  描画メソッドを呼び出して矢印を描く */
arrow11.setColor(&quot;red&quot;);
arrow11.draw(&quot;arrow&quot;,75,115,90);
arrow12.setColor(&quot;blue&quot;);
arrow12.draw(&quot;arrow&quot;,75,115,0);
arrow13.setColor(&quot;green&quot;);
arrow13.draw(&quot;arrow&quot;,75,115,230);

//ラベル・オブジェクトを作成
const label1 = Label();
//drawメソッドを呼び出して描く
label1.draw(&quot;arrow&quot;,&quot;x&quot;,5,200,10);
label1.draw(&quot;arrow&quot;,&quot;y&quot;,185,115,10);
label1.draw(&quot;arrow&quot;,&quot;z&quot;,75,5,10);&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas class=&quot;frame&quot; id=&quot;arrowsD20220613&quot; width=&quot;200&quot; height=&quot;230&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;script&gt;
//即時実行函数式でスクリプト全体を袋とじ
(function(){

  //度数法から弧度法へ角度を変換する函数
  function toRadians(degree){
    return degree * (Math.PI/180.0);
  }

  /* 極座標（円座標）を直交座標へ変換する函数
    引数は極座標r,θ（θはラジアン表記） */
  function polarToCartesianX(r,radian){
    return r * Math.cos(radian);
  }
  function polarToCartesianY(r,radian){
    return r * Math.sin(radian);
  }

  //直線オブジェクトを返すファクトリ函数
  function Line(){
    
    //プライベートなプロパティ
    const shaftTailX = 0; //始点の水平座標
    const shaftTailY = 0; //始点の垂直座標
    let ShaftHeadX = 100; //終点の水平座標
    const ShaftHeadY = 0; //終点の垂直座標
    let arrowWidth = 1; //線の太さ
    let color = &quot;black&quot; //線の色

    //オブジェクト・リテラルを返す
    return {
      //パブリックなアクセサーメソッド（セッター）
      setLength : function(arg){ShaftHeadX = arg;},
      setArrowWidth : function(arg){arrowWidth = arg;},
      setColor : function(arg){color = arg;},
       
      /* 描画メソッド：
         引数はCanvas要素のIDと描画座標と描画角度 */
      draw : function(CanvasId,x,y,angle){
          
        /* HTML5 Canvas 2DのAPIを利用する準備 */
        const Canvas = document.getElementById(CanvasId);
        const Ctx = Canvas.getContext(&quot;2d&quot;);

        //この時点の状態を保存
        Ctx.save();

        //座標系の原点を移動
        Ctx.translate(x,y);
        /* 座標系を原点を軸に回転移動
          かつ正負を反転させて反時計回りに */
        Ctx.rotate(toRadians(-1 * angle));
 
        //矢印の幹の直線を描く
        Ctx.beginPath();
        Ctx.lineWidth = arrowWidth;
        Ctx.strokeStyle = color;
        Ctx.moveTo(shaftTailX, shaftTailY);
        Ctx.lineTo(ShaftHeadX, ShaftHeadY);
        Ctx.stroke();

        //save()で保存した状態を復元
        Ctx.restore();   
      }
    };
  }

  //ラベル・オブジェクトを返すファクトリ函数
  function Label(){

    //プライベートなプロパティ
    let font = &quot;15px serif&quot;;
    let color = &quot;black&quot;;
    let align = &quot;center&quot;;
    let baseline = &quot;middle&quot;;

    //オブジェクト・リテラルを返す
    return {

      //アクセサー（セッター）
      setFont : function(arg){font = arg;},
      setColor : function(arg){color = arg;},
      setAlign : function(arg){align = arg;},
      setBaseline : function(arg){baseline = arg;},

      //描画メソッド
      draw : function(CanvasId,text,x,y,largestWidth){

        //HTML5 Canvas 2DのAPIを利用するための準備
        const Canvas = document.getElementById(CanvasId);
        const Ctx = Canvas.getContext(&quot;2d&quot;);

        //文字列を描画する
        Ctx.font = font;
        Ctx.strokeStyle = color;
        Ctx.textAlign = align;
        Ctx.textBaseline = baseline;
        Ctx.fillText(text,x,y,largestWidth);
      }
    };
  }

  //矢印オブジェクトを返すファクトリ函数
  function Arrow(){
     
    //プライベートなプロパティ
    const shaftTailX = 0; //幹末端の水平座標
    const shaftTailY = 0; //幹末端の垂直座標
    let ShaftHeadX = 100; //幹先端の水平座標
    const ShaftHeadY = 0; //幹先端の垂直座標
    let headLength = 7; //鏃の長さ
    let headAngle = 160; //鏃の角度
    let arrowWidth = 1; //矢印の太さ
    let color = &quot;black&quot; //矢の色

    //オブジェクト・リテラルを返す
    return {
      //パブリックなアクセサーメソッド（セッター）
      setArrowLength : function(arg){ShaftHeadX = arg;},
      setHeadLength : function(arg){headLength = arg;},
      setHeadAngle : function(arg){headAngle = arg;},
      setArrowWidth : function(arg){arrowWidth = arg;},
      setColor : function(arg){color = arg;},
      //ゲッター
      getShaftHeadX : function(){return ShaftHeadX;},
       
      /* 描画メソッド：
        引数はCanvas要素のIDと描画座標と描画角度 */
      draw : function(CanvasId,x,y,angle){
           
        /* HTML5 Canvas 2DのAPIを利用する準備 */
        const Canvas = document.getElementById(CanvasId);
        const Ctx = Canvas.getContext(&quot;2d&quot;);

        //この時点の状態を保存
        Ctx.save();

        //座標系の原点を移動
        Ctx.translate(x,y);
        /* 座標系を原点を軸に回転移動
         かつ正負を反転させて反時計回りに */
        Ctx.rotate(toRadians(-1 * angle));
  
        //矢印の幹の直線を描く
        Ctx.beginPath();
        Ctx.lineWidth = arrowWidth;
        Ctx.strokeStyle = color;
        Ctx.moveTo(shaftTailX, shaftTailY);
        Ctx.lineTo(ShaftHeadX, ShaftHeadY);
        Ctx.stroke();
  
        //鏃の部分を描く
                       
        //鏃の相対的座標を計算して変数に代入
        const HeadLeftWingX = polarToCartesianX(headLength,
          toRadians(headAngle)) + ShaftHeadX;
        const HeadLeftWingY = polarToCartesianY(headLength,
          toRadians(headAngle)) + ShaftHeadY;
        const HeadRightWingX = polarToCartesianX(headLength,
          toRadians(-1 * headAngle)) + ShaftHeadX;
        const HeadRightWingY = polarToCartesianY(headLength,
          toRadians(-1 * headAngle)) + ShaftHeadY;
  
        //鏃を描く
        Ctx.beginPath();
        Ctx.moveTo(ShaftHeadX, ShaftHeadY);
        Ctx.lineTo(HeadLeftWingX, HeadLeftWingY);
        Ctx.moveTo(ShaftHeadX, ShaftHeadY);
        Ctx.lineTo(HeadRightWingX, HeadRightWingY);
        Ctx.stroke();
  
        //save()で保存した状態を復元
        Ctx.restore();   
      }
    };
  }

  //極座標系（円座標系）を描く函数
  function polarCoordinateA(CanvasId){

    /* ファクトリ函数Arrowを呼び出して
      3つのArrowオブジェクトを作成 */
    const arrow1 = Arrow();
    const arrow2 = Arrow();
    const arrow3 = Arrow();
  
    /* 色設定メソッドを呼び出して矢の色を指定し、
      描画メソッドを呼び出して矢印を描く */
    arrow1.setColor(&quot;red&quot;);
    arrow1.draw(CanvasId,75,115,90);
    arrow2.setColor(&quot;blue&quot;);
    arrow2.draw(CanvasId,75,115,0);
    arrow3.setColor(&quot;green&quot;);
    arrow3.draw(CanvasId,75,115,230);

    //ラベル・オブジェクトを作成
    const label1 = Label();
    //drawメソッドを呼び出して描く
    label1.draw(CanvasId,&quot;x&quot;,5,200,10);
    label1.draw(CanvasId,&quot;y&quot;,185,115,10);
    label1.draw(CanvasId,&quot;z&quot;,75,5,10);
  }
  polarCoordinateA(&quot;arrow20220613&quot;);
  
  //ファクトリ函数を呼び出して線分オブジェクトを作成
  const line1 = Line();
  line1.draw(&quot;aLine20220613&quot;,0,10,0);

  //Arrowオブジェクトのインスタンス
  const arrow1 = Arrow();
  arrow1.setColor(&quot;black&quot;); //矢印の色
  arrow1.draw(&quot;anArrow20220613&quot;,0,10,0);
  
  //ArrowオブジェクトのheadLengthプロパティの実例
  const label1 = Label();
  line1.draw(&quot;arrowHead20220613&quot;,0,5,0);
  arrow1.setHeadLength(10); //鏃の長さ
  arrow1.setHeadAngle(0); //鏃の角度
  arrow1.draw(&quot;arrowHead20220613&quot;,0,35,0);
  label1.setFont(&quot;15px serif&quot;);
  label1.draw(&quot;arrowHead20220613&quot;,&quot;0度&quot;,140,35,50);
  arrow1.setHeadAngle(30);
  arrow1.draw(&quot;arrowHead20220613&quot;,0,65,0);
  label1.draw(&quot;arrowHead20220613&quot;,&quot;30度&quot;,140,65,50);
  arrow1.setHeadAngle(45);
  arrow1.draw(&quot;arrowHead20220613&quot;,0,95,0);
  label1.draw(&quot;arrowHead20220613&quot;,&quot;45度&quot;,140,95,50);
  arrow1.setHeadAngle(60);
  arrow1.draw(&quot;arrowHead20220613&quot;,0,125,0);
  label1.draw(&quot;arrowHead20220613&quot;,&quot;60度&quot;,140,125,50);
  arrow1.setHeadAngle(90);
  arrow1.draw(&quot;arrowHead20220613&quot;,0,155,0);
  label1.draw(&quot;arrowHead20220613&quot;,&quot;90度&quot;,140,155,50);
  arrow1.setHeadAngle(120);
  arrow1.draw(&quot;arrowHead20220613&quot;,0,185,0);
  label1.draw(&quot;arrowHead20220613&quot;,&quot;120度&quot;,140,185,50);
  arrow1.setHeadAngle(135);
  arrow1.draw(&quot;arrowHead20220613&quot;,0,215,0);
  label1.draw(&quot;arrowHead20220613&quot;,&quot;135度&quot;,140,215,50);
  arrow1.setHeadAngle(150);
  arrow1.draw(&quot;arrowHead20220613&quot;,0,245,0);
  label1.draw(&quot;arrowHead20220613&quot;,&quot;150度&quot;,140,245,50);
  arrow1.setHeadAngle(180);
  arrow1.draw(&quot;arrowHead20220613&quot;,0,275,0);
  label1.draw(&quot;arrowHead20220613&quot;,&quot;180度&quot;,140,275,50);
  arrow1.setHeadAngle(160);
  arrow1.setHeadLength(7);
  
  //スクリーン座標系
  const arrow2 = Arrow();
  arrow2.setArrowLength(170);
  arrow2.setColor(&quot;red&quot;);
  arrow2.draw(&quot;screenCoordinate20220613&quot;,20,25,270);
  arrow2.draw(&quot;screenCoordinate20220613&quot;,20,25,0);
  label1.draw(&quot;screenCoordinate20220613&quot;,&quot;x&quot;,200,25,10);
  label1.draw(&quot;screenCoordinate20220613&quot;,&quot;y&quot;,20,205,10);
  label1.draw(&quot;screenCoordinate20220613&quot;,&quot;(0,0)&quot;,15,15,30);

  //Arrowオブジェクトのwidthプロパティの実例
  arrow1.draw(&quot;arrowWidth20220613&quot;,0,5,0);
  arrow1.setArrowWidth(1.5);
  arrow1.draw(&quot;arrowWidth20220613&quot;,0,25,0);
  arrow1.setArrowWidth(2);
  arrow1.draw(&quot;arrowWidth20220613&quot;,0,45,0);
  arrow1.setArrowWidth(2.5);
  arrow1.draw(&quot;arrowWidth20220613&quot;,0,65,0);
  arrow1.setArrowWidth(3);
  arrow1.draw(&quot;arrowWidth20220613&quot;,0,85,0);
  arrow1.setArrowWidth(10);
  arrow1.draw(&quot;arrowWidth20220613&quot;,0,105,0);
  arrow1.setArrowWidth(1);

  //Arrowオブジェクトのcolorプロパティの実例
  arrow1.setColor(&quot;purple&quot;);
  arrow1.draw(&quot;arrowColor20220613&quot;,0,5,0);
  arrow1.setColor(&quot;red&quot;);
  arrow1.draw(&quot;arrowColor20220613&quot;,0,25,0);
  arrow1.setColor(&quot;blue&quot;);
  arrow1.draw(&quot;arrowColor20220613&quot;,0,45,0);
  arrow1.setColor(&quot;green&quot;);
  arrow1.draw(&quot;arrowColor20220613&quot;,0,65,0);
  arrow1.setColor(&quot;black&quot;);

  //直交座標系オブジェクトを返すファクトリ函数
  function CartesianCoordinate(){
    //プライベートなプロパティ
    let originX = 200; //原点の水平座標
    let originY = 200; //原点の垂直座標 

    return{
      //セッター
      setOriginX : function(arg){originX = arg;},
      setOriginY : function(arg){originY = arg;},
      //ゲッター
      getOriginX : function(){return originX;},
      getOriginY : function(){return originY;},

        //描画メソッド
      draw : function(CanvasId){
        const anArrow = Arrow();
        anArrow.setArrowLength(180);
        anArrow.setColor(&quot;red&quot;);
        anArrow.draw(CanvasId,originX,originY,0);
        anArrow.draw(CanvasId,originX,originY,90);
        const anLine = Line();
        anLine.setLength(180);
        anLine.setColor(&quot;red&quot;);
        anLine.draw(CanvasId,originX,originY,180);
      }
    };
  }

  //鋭角三角法を描く函数A
  function trigonometryA(CanvasId){
    //CartesianCoordinateオブジェクトを利用
    const carCoor1 = CartesianCoordinate();
    //デカルト座標系を描画
    carCoor1.draw(CanvasId)

    //HTML5 Canvas 2DのAPIを利用する準備
    const Canvas = document.getElementById(CanvasId);
    const Ctx = Canvas.getContext(&quot;2d&quot;);

    //動径PO（直角三角形の斜辺）
    Ctx.strokeStyle = &quot;blue&quot;;
    Ctx.lineWidth = 1.5;
    Ctx.setLineDash([0,0]);
    Ctx.beginPath();
    Ctx.moveTo(carCoor1.getOriginX(),
      carCoor1.getOriginY());
    Ctx.lineTo(290,80);
    Ctx.stroke();

    //直角三角形の3辺の線分の長さを計算
    const linePH = carCoor1.getOriginY() - 80;
    const lineOH = 290 - carCoor1.getOriginX();
    const lineOP = Math.sqrt(
      Math.pow(linePH,2) + Math.pow(lineOH,2));

    //PHの点線
    Ctx.setLineDash([3,2]);
    Ctx.strokeStyle = &quot;black&quot;;
    Ctx.lineWidth = 1;
    Ctx.beginPath();
    Ctx.moveTo(290,80);
    Ctx.lineTo(290,carCoor1.getOriginY());
    Ctx.stroke();

    //点線の円
    Ctx.beginPath();
    Ctx.arc(carCoor1.getOriginX(),
      carCoor1.getOriginY(),lineOP,
      toRadians(0),toRadians(180),true);
    Ctx.stroke();

    //角度の円
    Ctx.setLineDash([0,0]);
    Ctx.beginPath();
    Ctx.arc(carCoor1.getOriginX(),
      carCoor1.getOriginY(),15,
      toRadians(0),toRadians(305),true);
    Ctx.stroke();

    //直角
    Ctx.strokeStyle = &quot;black&quot;;
    Ctx.setLineDash([0,0]);
    Ctx.beginPath();
    Ctx.moveTo(290-10,carCoor1.getOriginY());
    Ctx.lineTo(290-10,carCoor1.getOriginY()-10);
    Ctx.lineTo(290,carCoor1.getOriginY()-10);
    Ctx.stroke();

    //ラベル
    const aLabel = Label();
    aLabel.draw(CanvasId,&quot;O&quot;,
      carCoor1.getOriginX(),
      carCoor1.getOriginY()+10,20);
    aLabel.draw(CanvasId,&quot;P(x,y)&quot;,290+15,80-10,40);
    aLabel.draw(CanvasId,&quot;H&quot;,290,
      carCoor1.getOriginY()+10,20);
    aLabel.draw(CanvasId,&quot;y&quot;,
      carCoor1.getOriginX(),5,20);
    aLabel.draw(CanvasId,&quot;x&quot;,390,
      carCoor1.getOriginY(),20);
    aLabel.draw(CanvasId,&quot;θ&quot;,220,190,20);
    aLabel.draw(CanvasId,&quot;r&quot;,240,130,20);
    aLabel.draw(CanvasId,&quot;1&quot;,350,210,20);
    aLabel.draw(CanvasId,&quot;-1&quot;,50,210,30);
  }

  //鈍角三角法を描く函数B
  function trigonometryB(CanvasId){
    //CartesianCoordinateオブジェクトを利用
    const carCoor1 = CartesianCoordinate();
    //デカルト座標系を描画
    carCoor1.draw(CanvasId)

    //HTML5 Canvas 2DのAPIを利用する準備
    const Canvas = document.getElementById(CanvasId);
    const Ctx = Canvas.getContext(&quot;2d&quot;);

    //動径PO（直角三角形の斜辺）
    Ctx.strokeStyle = &quot;blue&quot;;
    Ctx.lineWidth = 1.5;
    Ctx.setLineDash([0,0]);
    Ctx.beginPath();
    Ctx.moveTo(carCoor1.getOriginX(),
      carCoor1.getOriginY());
    Ctx.lineTo(65,133);
    Ctx.stroke();

    //直角三角形の3辺の線分の長さを計算
    const linePH = carCoor1.getOriginY() - 80;
    const lineOH = 290 - carCoor1.getOriginX();
    const lineOP = Math.sqrt(
      Math.pow(linePH,2) + Math.pow(lineOH,2));

    //PHの点線
    Ctx.setLineDash([3,2]);
    Ctx.strokeStyle = &quot;black&quot;;
    Ctx.lineWidth = 1;
    Ctx.beginPath();
    Ctx.moveTo(65,133);
    Ctx.lineTo(65,carCoor1.getOriginY());
    Ctx.stroke();

    //点線の円
    Ctx.beginPath();
    Ctx.arc(carCoor1.getOriginX(),
      carCoor1.getOriginY(),lineOP,
      toRadians(0),toRadians(180),true);
    Ctx.stroke();

    //角度の円
    Ctx.setLineDash([0,0]);
    Ctx.beginPath();
    Ctx.arc(carCoor1.getOriginX(),
      carCoor1.getOriginY(),15,
      toRadians(0),toRadians(205),true);
    Ctx.stroke();

    //直角
    Ctx.strokeStyle = &quot;black&quot;;
    Ctx.setLineDash([0,0]);
    Ctx.beginPath();
    Ctx.moveTo(65+10,carCoor1.getOriginY());
    Ctx.lineTo(65+10,carCoor1.getOriginY()-10);
    Ctx.lineTo(65,carCoor1.getOriginY()-10);
    Ctx.stroke();

    //ラベル
    const aLabel = Label();
    aLabel.draw(CanvasId,&quot;O&quot;,
      carCoor1.getOriginX(),
      carCoor1.getOriginY()+10,20);
    aLabel.draw(CanvasId,&quot;P(x,y)&quot;,65-15,133-10,40);
    aLabel.draw(CanvasId,&quot;H&quot;,65,
      carCoor1.getOriginY()+10,20);
    aLabel.draw(CanvasId,&quot;y&quot;,
      carCoor1.getOriginX(),5,20);
    aLabel.draw(CanvasId,&quot;x&quot;,390,
      carCoor1.getOriginY(),20);
    aLabel.draw(CanvasId,&quot;θ&quot;,205,177,20);
    aLabel.draw(CanvasId,&quot;r&quot;,130,152,20);
    aLabel.draw(CanvasId,&quot;1&quot;,350,210,20);
    aLabel.draw(CanvasId,&quot;-1&quot;,50,210,30);
  }
  
  //函数呼び出し
  trigonometryA(&quot;coordinateA20220613&quot;);
  trigonometryB(&quot;coordinateB20220613&quot;);

  //極座標系を描く函数
  function polarCoordinates(CanvasId){
    //矢印オブジェクト
    const anArrow = Arrow();
    anArrow.setArrowLength(150);
    anArrow.setColor(&quot;red&quot;);
    anArrow.draw(CanvasId,100,150,0);

    //線分オブジェクト
    const aLine = Line();
    aLine.setLength(150);
    aLine.setColor(&quot;blue&quot;);
    aLine.setArrowWidth(1.5);
    aLine.draw(CanvasId,100,150,120);

    //HTML5 Canvas 2DのAPIを使う準備
    const Canvas = document.getElementById(CanvasId);
    const Ctx = Canvas.getContext(&quot;2d&quot;);

    //円を描く
    Ctx.beginPath();
    Ctx.arc(100,150,15,toRadians(0),toRadians(235),true);
    Ctx.stroke();

    //ラベル・オブジェクト
    const aLabel = Label();
    aLabel.draw(CanvasId,&quot;θ&quot;,110,125,20);
    aLabel.draw(CanvasId,&quot;r&quot;,50,90,20);
    aLabel.draw(CanvasId,&quot;P(r,θ)&quot;,35,7,50);
  }

  //極座標を描く函数を呼び出す
  polarCoordinates(&quot;polarCoordinate20220613&quot;);

  //Arrowオブジェクトを様々に描画

  //矢印オブジェクトを生産
  const arrow5 = Arrow();
  const arrow6 = Arrow();
  const arrow7 = Arrow();
  //セッターを呼び出して色を設定
  arrow5.setColor(&quot;green&quot;);
  arrow6.setColor(&quot;#ff00ff&quot;);
  arrow7.setColor(&quot;rgb(0,128,128)&quot;);
  //描画メソッドを呼び出して描画
  //引数はCanvas要素ID,x座標,y座標,角度
  arrow5.draw(&quot;arrowsA20220613&quot;,100,100,0);
  arrow6.draw(&quot;arrowsA20220613&quot;,100,100,150);
  arrow7.draw(&quot;arrowsA20220613&quot;,100,100,-90);

  //矢印の長さを変更
  arrow5.setArrowLength(200);
  arrow6.setArrowLength(200);
  arrow5.draw(&quot;arrowsB20220613&quot;,0,100,0);
  arrow6.draw(&quot;arrowsB20220613&quot;,100,200,90);
  arrow7.draw(&quot;arrowsB20220613&quot;,100,100,45);

  //矢印オブジェクトを生産
  const arrow8 = Arrow();
  const arrow9 = Arrow();
  const arrow10 = Arrow();

  //鏃の長さを変更
  arrow8.setHeadLength(20);
  arrow9.setHeadLength(30);
  arrow10.setHeadLength(50);
  
  //鏃の角度を変更
  arrow8.setHeadAngle(45);
  arrow9.setHeadAngle(90);
  arrow10.setHeadAngle(150);

  //矢印を描画
  arrow8.draw(&quot;arrowsC20220613&quot;,0,30,0);
  arrow9.draw(&quot;arrowsC20220613&quot;,0,100,0);
  arrow10.draw(&quot;arrowsC20220613&quot;,0,180,0);

  //3つの矢の極座標系
  polarCoordinateA(&quot;arrowsD20220613&quot;);
  
})(); //即時実行函数式の終わり
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/6766478387198393801/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2022/06/html5-canvas.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/6766478387198393801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/6766478387198393801'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2022/06/html5-canvas.html' title='HTML5 Canvasで矢印を描いてみた（三角関数を利用）'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-6492399020307349510</id><published>2022-04-16T22:57:00.004+09:00</published><updated>2025-04-03T10:47:18.445+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><title type='text'>Lxdeの基本的なショートカットキー（快速鍵）／ホットキー</title><content type='html'>&lt;p&gt;私は普段使用しているLinux機に軽快なGUIインターフェイスを望んでいるので標準のデスクトップ環境（KDEやXfce等）でなくLxdeをインストールして使っている。さらに入力インターフェイスとしてはキーボードでの操作を好む。なぜだか最近のマウスはチャタリングを起こしやすく故障しやすいので。&lt;/p&gt;
&lt;p&gt;キーボードでの操作には、ショートカットキー、またはキーボード・ショートカット、ホットキー、漢字では快速鍵と呼ばれているものがある。そこでそれらの基本的なものを表にしてみた。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;働き&lt;/th&gt;
&lt;th&gt;快速鍵&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;2&quot;&gt;Lxpanelメニューを表示&lt;/td&gt;
&lt;td&gt;[Alt]+[F1]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[Ctrl]+[Esc]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lxpanelメニューを閉じる&lt;/td&gt;
&lt;td&gt;[Esc]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;2&quot;&gt;コマンド入力でアプリを起動&lt;/td&gt;
&lt;td&gt;[Alt]+[F2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[Windows]+[R]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ウィンドウを切り替える&lt;/td&gt;
&lt;td&gt;[Alt]+[Tab]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デスクトップを切り替える&lt;/td&gt;
&lt;td&gt;[Ctrl]+[Alt]+[←]/[→]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デスクトップ1へ&lt;/td&gt;
&lt;td&gt;[Windows]+[F1]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デスクトップ2へ&lt;/td&gt;
&lt;td&gt;[Windows]+[F2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デスクトップ3へ&lt;/td&gt;
&lt;td&gt;[Windows]+[F3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ウィンドウを閉じる&lt;/td&gt;
&lt;td&gt;[Alt]+[F4]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ウィンドウを全画面表示&lt;/td&gt;
&lt;td&gt;[F11]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ウインドウごとデスクトップ移動&lt;/td&gt;
&lt;td&gt;[Alt]+[Shift]+[←]/[→]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;全てのウィンドウを表示／非表示&lt;/td&gt;
&lt;td&gt;[Ctril]+[Alt]+[D]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ウィンドウの操作メニューを表示&lt;/td&gt;
&lt;td&gt;[Alt]+[Space]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ウィンドウの操作メニューを閉じる&lt;/td&gt;
&lt;td&gt;[Esc]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;タスクマネージャーを起動&lt;/td&gt;
&lt;td&gt;[Ctrl]+[Alt]+[Delete]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;タスクマネージャーを終了&lt;/td&gt;
&lt;td&gt;[Esc]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ファイルマネージャーPCManFMを起動&lt;/td&gt;
&lt;td&gt;[Windows]+[E]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ファイルマネージャーPCManFMを終了&lt;/td&gt;
&lt;td&gt;[Ctrl]+[Q]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ファイル検索ダイアログを起動&lt;/td&gt;
&lt;td&gt;[Windows]+[F]&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;[Space]はスペースキー。&lt;/li&gt;
&lt;li&gt;[Windows]はWindowsキーのこと。それは[Alt]の左隣または右隣にある。&lt;/li&gt;
&lt;li&gt;ファイル検索のダイアログはファイルマネージャーPCManFMのものなので、それが表示されているデスクトップに表示される。それとは異なるデスクトップで起動した場合、起動してないように見えるので要注意。&lt;/li&gt;
&lt;li&gt;ウィンドウ操作メニューは矢印キー（[↑][↓][←][→]）で移動、[Enter]キーで確定、[Esc]キーで取り消し。&lt;/li&gt;
&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/6492399020307349510/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2022/04/lxde.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/6492399020307349510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/6492399020307349510'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2022/04/lxde.html' title='Lxdeの基本的なショートカットキー（快速鍵）／ホットキー'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-5752907255115321690</id><published>2022-03-20T14:27:00.004+09:00</published><updated>2025-09-04T09:49:04.355+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Canvas"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><title type='text'>JavaScriptでオブジェクトを作成する方法</title><content type='html'>&lt;p&gt;オブジェクト指向言語には大きく分けてクラス・ベースのものとプロトタイプ・ベースのものとがある。JavaScriptはプロトタイプ・ベースのオブジェクト指向としての特徴を備えているとされている。&lt;/p&gt;
&lt;p&gt;オブジェクトとは、関連する変数や函数をまとめて名前を付けた参照型の変数のことであり、オブジェクト型変数とも呼ばれている。&lt;/p&gt;
&lt;p&gt;JavaScriptでプログラマーが独自にオブジェクトを作るには、
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#39;#objectLiterals22320&#39;&gt;オブジェクト・リテラル、&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#39;#factoryFunctions22320&#39;&gt;ファクトリ函数、&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#39;#objectConstructors22320&#39;&gt;Object()コンストラクター、&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#39;#constructorFunctions22320&#39;&gt;コンストラクター函数、&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#39;#classStatements22320&#39;&gt;クラス構文、&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;継承&lt;/li&gt;
&lt;/ol&gt;
などを用いる方法がある。それぞれについて見ていく。ただし継承についてはこの投稿では触れない。&lt;/p&gt;
&lt;h4 id=&#39;objectLiterals22320&#39;&gt;オブジェクト・リテラル&lt;/h4&gt;
&lt;p&gt;関連する変数や函数であるプロパティの定義を列挙したオブジェクト・リテラルを変数に代入するとJavaScriptでは簡単にオブジェクトを作ることができる。この方法はオブジェクト・イニシャライザーとも呼ばれている。&lt;/p&gt;
&lt;p&gt;ただしこの方法では1つのオブジェクト・リテラルから1つのオブジェクトしか作ることができない。&lt;/p&gt;
&lt;p&gt;オブジェクト・リテラルの構文はJSON(JavaScript Object Notation)やPythonの辞書型のそれに似ている。すなわち「{キー:値,キー:値,...}」のようにコーディングし、そのオブジェクト・リテラルを変数に代入するだけでオブジェクトが1つ作られる。オブジェクト・リテラルではこのキーがプロパティ名やメソッド名になる。&lt;/p&gt;
&lt;p&gt;オブジェクト・リテラルは次のようにコーディングする。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;キーワード 変数名 = {
   プロパティ名1 : 値,
   プロパティ名2 : 値,
   プロパティ名3 : 値
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;キーワードにはletかconstかvarを指定することができる。&lt;/p&gt;
&lt;p&gt;プロパティの値に函数式を与えるとそのプロパティはメソッドになる。メソッドは特別な値を持ったプロパティ。メソッドはコード・プロパティとも呼ばれることがある。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;キーワード 変数名 = {
   プロパティ名 : 値,
   メソッド名 : function(仮引数){} // 函数式
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;変数に代入されるかプロパティの値に与えられる函数の定義方法は函数式とか函数リテラルと呼ばれている。それに対して独立した函数の定義方法は函数宣言とか函数文と呼ばれている。函数式の式は英語ではan expression。&lt;/p&gt;
&lt;p&gt;函数宣言ではその函数に固有の名前（識別子）を付けるが、函数式に使われるのは名前を付けない匿名函数か矢印函数。ただし函数ブロック内でその函数を再帰的に呼び出すために匿名函数に便宜的に名前を付けることがある。&lt;/p&gt;
&lt;p&gt;仮引数というのはその函数が呼び出されるときに一緒に括弧内に渡す値を受け取るように定義された変数であり、パラメーターとも呼ばれている。数学と違って計算機科学での変数はデータを保存する記憶領域を暗に指している。&lt;/p&gt;
&lt;p&gt;オブジェクト・リテラルによって作成したオブジェクトはプレイン・オブジェクトと呼ばれることがある。&lt;/p&gt;
&lt;p&gt;オブジェクトを定義しているコード・ブロックの中で定義したプロパティをその外から参照するには「オブジェクト名.プロパティ名」のようにドット演算子を用いる。&lt;/p&gt;
&lt;p&gt;プロパティに値を設定するには次のようにコーディングする。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;オブジェクト名.プロパティ名 = 値;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;メソッドを呼び出すには次のようにする。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;オブジェクト名.メソッド名(引数);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次に例として挙げるコードは、オブジェクト・リテラルによってオブジェクトを定義し、それをcircleという変数に代入してcircleというオブジェクトを作成し、そのオブジェクトの構成要素であるプロパティとメソッドにメッセージを送り、色違いの3つの円をHTMLドキュメント上に描くもの。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;canvas id=&quot;ol_circle&quot; width=&quot;300&quot; height=&quot;150&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script&amp;gt;
// オブジェクトを作成
const circle = {
   radius : 30, // 半径
   line_width : 5, // 線の太さ
   stroke_color : &#39;blue&#39;, // 線の色
   fill_color : &#39;skyblue&#39;, // 塗りつぶす色
   // 円を描くメソッド（canvas要素ID、水平座標、垂直座標）
   draw : function(canvas_id,x,y) {
      // HTML5 Canvasの2DコンテキストのAPIを利用
      const canvas = document.getElementById(canvas_id);
      const ctx = canvas.getContext(&#39;2d&#39;);
      ctx.beginPath(); // パスを初期化
      // 円のパス（水平座標、垂直座標、半径、始点、終点）
      ctx.arc(x,y,circle.radius,0,Math.PI*2);
      ctx.closePath(); // パスを閉じる
      ctx.lineWidth = circle.line_width; // 線の太さ
      ctx.strokeStyle = circle.stroke_color; // 線の色
      ctx.stroke(); // 線を描く
      ctx.fillStyle = circle.fill_color; // 塗りつぶす色
      ctx.fill(); // 塗りつぶす
   }
};

// メソッドを呼び出す
circle.draw(&#39;ol_circle&#39;,60,70);
   
// 円の色を再設定
circle.stroke_color = &#39;orange&#39;; // 線の色
circle.fill_color = &#39;yellow&#39;; // 塗りつぶす色

// その右に円を更に描く
circle.draw(&#39;ol_circle&#39;,130,70);

// 円の色を再々設定
circle.stroke_color = &#39;red&#39;; // 線の色
circle.fill_color = &#39;pink&#39;; // 塗りつぶす色

// 更にその右に円を描く
circle.draw(&#39;ol_circle&#39;,200,70);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このコードをHTMLのbody要素の間に埋め込んでウェブ・ブラウザで読み込むと次のような3つの円が描かれるはず。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;ol_circle&quot; width=&quot;300&quot; height=&quot;150&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;描かれた円は3つだが、作ったオブジェクトはただ1つ。定義したcircleオブジェトのdrawメソッドを呼び出して1つの円を描いた後、色のプロパティを設定し直して再度drawメソッドを呼び出して描画することによって異なる色の3つの円を描いた。&lt;/p&gt;
&lt;p&gt;ちなみに、HTML5 Canvasでは.clearRect()メソッドを用いて明示的に消去しないかぎり、何度描き直しても前に描いたものはクリアされずに残る。&lt;/p&gt;
&lt;h4 id=&#39;factoryFunctions22320&#39;&gt;ファクトリ函数&lt;/h4&gt;
&lt;p&gt;ファクトリ函数はオブジェクトを返り値に持つ函数であり、オブジェクト・リテラルをその返り値に与える構文によって定義される。&lt;/p&gt;
&lt;p&gt;オブジェクト・リテラルでは単体のオブジェクトしか作成することができないのに対し、ファクトリ函数ではオブジェクトを量産することができる。&lt;/p&gt;
&lt;p&gt;同じオブジェクトを複数作成したい場合、その数だけオブジェクト・リテラルを記述しなくてもその作業を函数にやらせてしまえばいいというのがファクトリ函数の考え方。&lt;/p&gt;
&lt;p&gt;ファクトリ函数の構文は次のとおり。函数がオブジェクト・リテラルを包み込むような構造をしている。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;function 函数名(仮引数){
   キーワード 変数名 = {
      プロパティ名1 : 値,
      プロパティ名2 : 値,
      プロパティ名3 : 値
   };
   return 変数名;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;キーワードにはletかconstかvarを指定することができる。&lt;/p&gt;
&lt;p&gt;次のようにコーディングすることもできる。こちらのほうが一般的。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;function 函数名(仮引数){
   return {
      プロパティ名1 : 値,
      プロパティ名2 : 値,
      プロパティ名3 : 値
   };
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C++やJavaのような言語にはオブジェクトのプロパティへのアクセス制御を行うアクセス修飾子と呼ばれるものがある。&lt;/p&gt;
&lt;p&gt;アクセス演算子にはprivateとpublicとprotectedとが一般的にある。private（プライベート）は外部からのアクセスを禁じ、public（パブリック）は外部からのアクセスを許可する。protected（プロテクテド）は継承されたオブジェクトからのアクセスだけを許可する。&lt;/p&gt;
&lt;p&gt;ところが、JavaScriptにはアクセスを制御するためのアクセス修飾子がない。けれども、ファクトリ函数では次のようにすることによってプロパティのアクセス制御を可能にし、オブジェクトのカプセル化を実装することができる。&lt;/p&gt;
&lt;p&gt;そのためにはプロパティを函数内の通常の変数として扱い、letやvarというキーワードを付けてreturnキーワードより前に並べ、returnキーワード後のオブジェクト・リテラルのコード・ブロック内には各変数にアクセスするためのゲッター（取得者）とセッター（設定者）と呼ばれるメソッドの定義を並べる。例えば次のように。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;function 函数名(仮引数){
   // プライベート
   let 変数名1 = 値;
   let 変数名2 = 値;
   let 変数名3 = 値;
   return {
      // パブリック
      ゲッター名1 : () =&amp;gt; 変数名1,
      ゲッター名2 : () =&amp;gt; 変数名2,
      ゲッター名3 : () =&amp;gt; 変数名3,
      セッター名1 : 仮引数1 =&amp;gt; 変数名1 = 仮引数1,
      セッター名2 : 仮引数2 =&amp;gt; 変数名2 = 仮引数2,
      セッター名3 : 仮引数3 =&amp;gt; 変数名3 = 仮引数3,
      メソッド名 : function(仮引数){}
   };
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このようにすると、returnキーワードの後のオブジェクト・リテラルの部分だけがパブリックになって外部からアクセスでき、そうでないローカル変数の分はプライベートになって外部からは隠蔽される。&lt;/p&gt;
&lt;p&gt;このコードで用いた「() =&amp;gt;」は矢印函数とも呼ばれているもの。アロー函数とも呼ばれている。通常の匿名函数「function(){}」よりも簡略にコーディングできるけれども動作する上で制約がある。矢印函数ではthisキーワードが有効でないので要注意。&lt;/p&gt;
&lt;p&gt;矢印函数を使わずに匿名函数を使った場合には次のようになる。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;function 函数名(仮引数){
   // プライベート
   let 変数名1 = 値;
   let 変数名2 = 値;
   let 変数名3 = 値;
   return {
      // パブリック
      ゲッター名1 : function(){return 変数名1},
      ゲッター名2 : function(){return 変数名2},
      ゲッター名3 : function(){return 変数名3},
      セッター名1 : function(仮引数1){変数名1 = 仮引数1},
      セッター名2 : function(仮引数2){変数名2 = 仮引数2},
      セッター名3 : function(仮引数3){変数名3 = 仮引数3},
      メソッド名 : function(仮引数){}
   };
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ここで用語について少し注釈。JavaScriptではゲッターとセッターというメソッドが共にアクセサー・プロパティと呼ばれている。通常のプロパティはデータ・プロパティとも呼ばれており、メソッドはコード・プロパティと呼ばれることがある。いずれも広義のオブジェクト・プロパティ。&lt;/p&gt;
&lt;p&gt;ファクトリ函数を呼び出してオブジェクトを作成する際にはnewキーワードを用いない。ファクトリ函数を呼び出してその返り値を変数に代入するだけで複数のオブジェクトを作り出すことができる。この変数名がオブジェクト名になる。&lt;/p&gt;
&lt;pre class=&#39;note&#39;&gt;キーワード 変数名 = ファクトリ関数名(引数1,引数2);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次のコードではCircleと名付けたファクトリ函数を用いて円を描くためのオブジェクトを定義している。円を描く線の色と円を塗りつぶす色を引数にしてこのファクトリ函数を呼び出すと、円を描くためのプロパティとメソッドを持ったオブジェクトが出力される仕組み。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;canvas id=&quot;ff_circle&quot; width=&quot;300&quot; height=&quot;200&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script&amp;gt;
// Circleオブジェクトを定義するファクトリ函数
function Circle(strokeColor,fillColor){
   // プライベートなプロパティ（ローカル変数）
   let radius = 30; // 円の半径
   let line_width = 5; // 線の太さ
   let stroke_color = strokeColor || &#39;blue&#39;; // 線の色
   let fill_color = fillColor || &#39;skyblue&#39;; // 塗りつぶす色
   
   // オブジェクト・リテラルを返す
   return {
      // パブリックなゲッター
      getRadius : () =&amp;gt; radius,
      getLineWidth : () =&amp;gt; line_width,
      getStrokeColor : () =&amp;gt; stroke_color,
      getFillColor : () =&amp;gt; return fill_color,
      
      // パブリックなセッター
      setRadius : arg =&amp;gt; radius = arg,
      setLineWidth : arg =&amp;gt; line_width = arg,
      setStrokeColor : arg =&amp;gt; stroke_color = arg,
      setFillColor : arg =&amp;gt; fill_color = arg,
         
      // 円を描くパブリックなメソッド
      //（canvas要素ID、水平座標、垂直座標）
      draw : function(canvas_id,x,y){
         // HTML5 Canvasの2DコンテキストのAPIを利用
         const canvas = document.getElementById(canvas_id);
         const ctx = canvas.getContext(&#39;2d&#39;);
         ctx.beginPath(); // パスの初期化
         // 円のパス(水平座標、垂直座標、半径、始点、終点)
         ctx.arc(x,y,radius,0,Math.PI*2);
         ctx.closePath(); // パスを閉じる
         ctx.lineWidth = line_width; // 線の太さ
         ctx.strokeStyle = stroke_color; // 線の色
         ctx.stroke(); // 線を描く
         ctx.fillStyle = fill_color; // 塗りつぶす色
         ctx.fill(); // 塗りつぶす
      }
   };
}

// ファクトリ函数を呼び出してオブジェクトを作成
const circle1 = Circle(); // 引数なし
const circle2 = Circle(&#39;orange&#39;,&#39;yellow&#39;);
const circle3 = Circle(&#39;red&#39;,&#39;pink&#39;);

// drawメソッドを呼び出して円を描く
circle1.draw(&#39;ff_circle&#39;,60,60);
circle2.draw(&#39;ff_circle&#39;,130,60);
circle3.draw(&#39;ff_circle&#39;,200,60);

// 線の色と塗りつぶす色をセッターで再設定
circle1.setStrokeColor(&#39;black&#39;);
circle2.setStrokeColor(&#39;green&#39;);
circle3.setStrokeColor(&#39;saddlebrown&#39;);
circle1.setFillColor(&#39;grey&#39;);
circle2.setFillColor(&#39;lightgreen&#39;);
circle3.setFillColor(&#39;peru&#39;);

// 下隣の座標に円を描画
circle1.draw(&#39;ff_circle&#39;,60,130);
circle2.draw(&#39;ff_circle&#39;,130,130);
circle3.draw(&#39;ff_circle&#39;,200,130);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ファクトリ函数はそれを呼び出すごとにいくつでもオブジェクトを生成できるので、このコードでは3つのオブジェクトを生み出し、その上で円を塗りつぶす色のプロパティの値をアクセサーを用いて変えることにより色違いの計6つの円を描くようにコーディングした。&lt;/p&gt;
&lt;p&gt;プロパティは外部から直接アクセスできないようにletキーワードを用いてオブジェクト・リテラルの外側で定義することによってプライベートにした。そしてgetとsetという接頭辞を付けた名前のアクセサーを各々のデータ・プロパティのために用意し、それらアクセサーを介してのみ各々のデータ・プロパティに外部からアクセスできるようにした。&lt;/p&gt;
&lt;p&gt;このコードをHTMLのbody要素の間に埋め込んでウェブ・ブラウザで読み込むと次のように色違いの6つの円が描かれるはず。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;ff_circle&quot; width=&quot;300&quot; height=&quot;200&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;h4 id=&#39;objectConstructors22320&#39;&gt;Object()コンストラクター&lt;/h4&gt;
&lt;p&gt;newキーワードと共にObject()を用いるとオブジェクトを作ることができる。Object()の括弧内の引数に何も指定しないかnullやundefinedを指定した場合には空のオブジェクトが生み出される。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;キーワード 変数名 = new Object();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;キーワードにはletかconstかvarを用いる。&lt;/p&gt;
&lt;p&gt;この手続きは他のオブジェクト指向言語では一般にインスタンス化と呼ばれている。例えばJavaでもこの際にnewキーワードを用いる。&lt;/p&gt;
&lt;p&gt;コンストラクターとはインスタンス化と共に自動的に実行される特別な函数のこと。JavaScriptではコンストラクターとnewキーワードとは不可分の関係にある。&lt;/p&gt;
&lt;p&gt;空のオブジェクトには次のようにしてプロパティとその値とを後から追加することができる。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;変数名.プロパティ名 = 値;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;プロパティの値に匿名函数や矢印函数の定義を与えるとそれはメソッドになる。&lt;/p&gt;
&lt;p&gt;次のコードでは、circleという空のオブジェクトを作成し、その後にcircleオブジェクトのプロパティとメソッドを設定している。メソッドの定義では矢印函数を用いた。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;canvas id=&quot;ol_circle&quot; width=&quot;300&quot; height=&quot;150&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script&amp;gt;
// 空のオブジェクトを生成
const circle = new Object();

// 円の各種プロパティを設定
circle.radius = 30; // 円の半径
circle.line_width = 5; // 線の太さ
circle.stroke_color = &#39;blue&#39;; // 線の色
circle.fill_color = &#39;skyblue&#39;; // 塗りつぶす色
//円を描くメソッド（矢印函数）
circle.draw = (canvasId,x,y) =&amp;gt; {
   // HTML5 Canvasの2DコンテキストのAPIを利用
   const canvas = document.getElementById(canvasId);
   const ctx = canvas.getContext(&#39;2d&#39;);
   ctx.beginPath(); // パスの初期化
   // 円のパス（水平座標、垂直座標、半径、始点、終点）
   ctx.arc(x,y,circle.radius,0,Math.PI*2);
   // 線の太さ
   ctx.lineWidth = circle.line_width;
   // 線の色
   ctx.strokeStyle = circle.stroke_color;
   ctx.stroke(); // 線を描く
   // 塗りつぶす色
   ctx.fillStyle = circle.fill_color;
   ctx.fill(); // 塗りつぶす
};

// drawメソッドを呼び出して円を1つ描く
circle.draw(&#39;oc_circle&#39;,60,60);

// 円の色を再設定
circle.stroke_color = &#39;orange&#39;;
circle.fill_color = &#39;yellow&#39;;

// 右隣に円を1つ描く
circle.draw(&#39;oc_circle&#39;,130,60);

// 円の色を再々設定
circle.stroke_color = &#39;red&#39;;
circle.fill_color = &#39;pink&#39;;

// その右隣に円を1つ描く
circle.draw(&#39;oc_circle&#39;,200,60);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;作成したオブジェクトは1つだが、HTML5 Canvasを利用して円を描くdrawメソッドを3回呼び出し、プロパティを設定し直すことで色違いの円を3つ描くようにした。&lt;/p&gt;
&lt;p&gt;このコードをHTMLのbody要素の間に埋め込んでウェブ・ブラウザに読み込むと次のように表示されるはず。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;oc_circle&quot; width=&quot;300&quot; height=&quot;150&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;h4 id=&#39;constructorFunctions22320&#39;&gt;コンストラクター函数&lt;/h4&gt;
&lt;p&gt;コンストラクター函数も量産型のオブジェクトを定義する場合に用いることができる。コンストラクター函数ではパブリックなプロパティとパブリックなメソッドにthis.を付けて定義する必要がある。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;function 函数名(仮引数){
   this.プロパティ名1 = 値;
   this.プロパティ名2 = 値;
   this.プロパティ名3 = 値;
   this.メソッド名 = function(仮引数){}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;プロパティに外から直接アクセスできないようにするには、ファクトリ函数のときと同様にプロパティを通常のローカル変数にするためにその前にletかvarかconstかいずれかのキーワードを付ける必要がある。そしてその代わりにゲッターとセッターというアクセス用のメソッド（アクセサー）を定義し、それらのメソッド（アクセサー）を介してプロパティの参照と設定を行う。&lt;/p&gt;
&lt;pre class=&#39;note&#39;&gt;function 函数名(仮引数){
   // プライベート
   let 変数名1 = 値;
   let 変数名2 = 値;
   let 変数名3 = 値;
   
   // パブリック
   this.ゲッター名1 () =&amp;gt; 変数名1;
   this.ゲッター名2 () =&amp;gt; 変数名2;
   this.ゲッター名3 () =&amp;gt; 変数名3;
   this.セッター名1 (仮引数a) =&amp;gt; 変数名1 = 仮引数a;
   this.セッター名2 (仮引数b) =&amp;gt; 変数名2 = 仮引数b;
   this.セッター名3 (仮引数c) =&amp;gt; 変数名3 = 仮引数c;
   this.メソッド名 = function(仮引数){}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;letというキーワードと共に定義されているローカル変数は外から直接アクセスできないためにプライベートになる。このことはキーワードにvarやconstを用いても同様。&lt;/p&gt;
&lt;p&gt;this.によって定義されているプロパティやアクセサーやメソッドは外から直接アクセスできるためにパブリックになる。&lt;/p&gt;
&lt;p&gt;コンストラクター函数を定義したら、newキーワードと一緒に呼び出して変数に代入することでオブジェクトを作成できる。いわゆるインスタンス化。コンストラクター函数の定義内で用いられたthisキーワードが指し示すのがこの変数名であり、この変数名がオブジェクト名となる。&lt;/p&gt;
&lt;pre class=&#39;note&#39;&gt;キーワード 変数名 = new コンストラクター関数名(引数1,引数2);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;アクセサーなどのメソッドを呼び出す方法はこれまでと同様。&lt;/p&gt;
&lt;pre class=&#39;note&#39;&gt;オブジェクト名.メソッド名(引数1,引数2);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次のコードではコンストラクター函数によってHTMLドキュメント上に円を描くためのオブジェクトの定義と作成を行っている。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;canvas id=&quot;cf_circle&quot; width=&quot;300&quot; height=&quot;120&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script&amp;gt;
// オブジェクトを定義
function Circle(strokeColor,fillColor){
   // プライベートな変数
   let radius = 30; // 円の半径
   let line_width = 5; // 線の太さ
   let stroke_color = strokeColor || &#39;blue&#39;; // 線の色
   let fill_color = fillColor || &#39;skyblue&#39;; // 塗りつぶす色

   // パブリックなゲッター
   this.getRadius = () =&amp;gt; radius;
   this.getLineWidth = () =&amp;gt; line_width;
   this.getStrokeColor = () =&amp;gt; stroke_color;
   this.getFillColor = () =&amp;gt; fill_color;

   // パブリックなセッター
   this.setRadius = arg =&amp;gt; radius = arg;
   this.setLineWidth = arg =&amp;gt; line_width = arg;
   this.setStrokeColor = arg =&amp;gt; stroke_color = arg;
   this.setFillColor = arg =&amp;gt; fill_color = arg;
      
   // 円を描くパブリックなメソッド
   //（canvas要素のID、水平座標、垂直座標）
   this.draw = function(canvasId,x,y,){
      // HTML5 Canvasの2DコンテキストのAPIを使う
      const canvas = document.getElementById(canvasId);
      const ctx = canvas.getContext(&#39;2d&#39;);
      ctx.beginPath(); // パスを初期化
      // 円のパス（水平座標、垂直座標、半径、始点、終点）
      ctx.arc(x,y,radius,0,Math.PI*2);
      ctx.lineWidth = line_width; // 線の太さ
      ctx.strokeStyle = stroke_color; // 線の色
      ctx.stroke(); // 線を描く
      ctx.fillStyle = fill_color; // 塗りつぶす色
      ctx.fill(); // 塗りつぶす
   }
}

// 個々のオブジェクトを作成（インスタンス化）
const circle1 = new Circle()
const circle2 = new Circle(&#39;orange&#39;,&#39;yellow&#39;);
const circle3 = new Circle(&#39;red&#39;,&#39;pink&#39;);

// 円を描くメソッドを使う
circle1.draw(&#39;cf_circle&#39;,60,60);
circle2.draw(&#39;cf_circle&#39;,130,60);
circle3.draw(&#39;cf_circle&#39;,200,60);

// 円の半径を再設定
circle1.setRadius(20);
circle2.setRadius(20);
circle3.setRadius(20);

// 少し下の座標に円を描画
circle1.draw(&#39;cf_circle&#39;,60,130);
circle2.draw(&#39;cf_circle&#39;,130,130);
circle3.draw(&#39;cf_circle&#39;,200,130);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;コンストラクター函数の名前（函数の識別子）は通常の函数と見分けるために先頭を大文字にする慣例がある。したがってCircleとした。&lt;/p&gt;
&lt;p&gt;コンストラクター関数の冒頭でletキーワードと共に宣言してあるローカル変数はプライベート。それらは外部からアクセスできない。そのことはvarやconstをキーワードに選んでも同じ。&lt;/p&gt;
&lt;p&gt;this.が付けられているメソッドはパブリック。それらには外部からアクセスすることができる。&lt;/p&gt;
&lt;p&gt;上記のコードでは円の半径を再設定するためにそのプロパティに直接アクセスするのではなくセッターというメソッドを利用している。&lt;/p&gt;
&lt;p&gt;このコードをHTMLドキュメントのbody要素間に埋め込んでウェブ・ブラウザで読み込むと次のように色や大きさの異なる円が6つ描かれるはず。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;cf_circle&quot; width=&quot;300&quot; height=&quot;200&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;h4 id=&#39;classStatements22320&#39;&gt;クラス構文&lt;/h4&gt;
&lt;p&gt;クラス構文の実体はコンストラクター函数であるが、クラス・ベースのオブジェクト指向言語に慣れ親しんでいる人たち向けに採用された構文。&lt;/p&gt;
&lt;p&gt;クラス構文は次のような書式に従う。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;class クラス名{
   constructor(仮引数){
      this.プロパティ名 = 値;
      this.プロパティ名 = 値;
   }
   this.メソッド名 = function(仮引数){}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;クラス構文でカプセル化を実装するには、すなわちデータ・プロパティへの直接のアクセスを禁じるには、次のようにデータ・プロパティ名に接頭辞として#（ハッシュ）を付けるハッシュ名を利用できる。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;class クラス名{
   #プロパティ名1;
   #プロパティ名2;

   constructor(仮引数){
      this.#プロパティ名1 = 値;
      this.#プロパティ名2 = 値;
   }

   ゲッター名1(){return this.#プロパティ名1;}
   ゲッター名2(){return this.#プロパティ名2;}

   セッター名1(仮引数1){this.#プロパティ名1 = 仮引数1;}
   セッター名2(仮引数2){this.#プロパティ名2 = 仮引数2;}

   メソッド名(仮引数){}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;クラス構文は内部的にはコンストラクター函数であるのでnewキーワードと共に呼び出してオブジェクトを作る。&lt;/p&gt;
&lt;pre class=&#39;note&#39;&gt;キーワード 変数名 = new クラス名(引数);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;クラス構文を用いてCircleオブジェクトを定義してインスタンス化した1例が次のコード。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;canvas id=&quot;cd_circle&quot; width=&quot;300&quot; height=&quot;120&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script&amp;gt;
// クラスを定義
class Circle{
   // 各種プロパティを宣言
   #radius; // 円の半径
   #line_width; // 線の太さ
   #stroke_color; // 線の色
   #fill_color; // 塗りつぶす色
      
   // コンストラクター（初期値を代入する函数）
   constructor(strokeColor,fillColor){
      this.#radius = 30;
      this.#line_width = 5;
      this.#stroke_color = strokeColor || &#39;blue&#39;;
      this.#fill_color = fillColor || &#39;skyblue&#39;;
   }

   // 各プロパティの値を取得するメソッド
   getRadius(){return this.#radius;}
   getLineWidth(){return this.#line_width;}
   getStrokeColor(){return this.#stroke_color;}
   getFillColor(){return this.#fill_color;}

   // 各プロパティの値を設定するメソッド
   setRadius(arg){this.#radius = arg;}
   setLineWidth(arg){this.#line_width = arg;}
   setStrokeColor(arg){this.#stroke_color = arg;}
   setFillColor(arg){this.#fill_color = arg;}

   // 円を描くメソッド（canvas要素のID、水平座標、垂直座標）
   draw(canvasId,x,y){
      // HTML5 Canvasの2DコンテキストのAPIを使う
      const canvas = document.getElementById(canvasId);
      const ctx = canvas.getContext(&#39;2d&#39;);
      ctx.beginPath(); // パスの初期化
      // 円のパス（水平座標、垂直座標、半径、始点、終点）
      ctx.arc(x,y,this.#radius,0,Math.PI*2);
      ctx.lineWidth = this.#line_width; // 線の太さ
      ctx.strokeStyle = this.#stroke_color; // 線の色
      ctx.stroke(); // 円を描く
      ctx.fillStyle = this.#fill_color; // 塗りつぶす色
      ctx.fill(); // 塗りつぶす
   }
}

// Circleクラスから個々の円オブジェクトを作成
const circle1 = new Circle();
const circle2 = new Circle(&#39;orange&#39;,&#39;yellow&#39;);
const circle3 = new Circle(&#39;red&#39;,&#39;pink&#39;);

// 円を描くメソッドを呼び出す
circle1.draw(&#39;cd_circle&#39;,60,60);
circle2.draw(&#39;cd_circle&#39;,130,60);
circle3.draw(&#39;cd_circle&#39;,200,60);

// 円の線の太さを再設定
circle1.setLineWidth(8);
circle2.setLineWidth(8);
circle3.setLineWidth(8);

// 少し下の座標に円を描く
circle1.draw(&#39;cd_circle&#39;,60,130);
circle2.draw(&#39;cd_circle&#39;,130,130);
circle3.draw(&#39;cd_circle&#39;,200,130);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;クラス構文はC++やJavaのクラス宣言に近い。コンストラクターと呼ばれるメンバ函数はC++やJavaではクラス名と同じ名前を使う決まりがあるが、JavaScriptのクラス構文ではconstructorキーワードを用いる。&lt;/p&gt;
&lt;p&gt;このコードをHTMLドキュメントのbody要素の間に埋め込んでウェブ・ブラウザで読み込むと色や線の太さが異なる6つの円が次のように描かれるはず。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;cd_circle&quot; width=&quot;300&quot; height=&quot;200&quot;&gt;
このウェブブラウザはHTML5 CanvasかJavaScriptに対応していません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;h4&gt;getキーワードとsetキーワード&lt;/h4&gt;
&lt;p&gt;ECMAScript 2015（ES6）からgetとsetというキーワードを用いてゲッターとセッターを記述できるようになっている。例えば次のような書式によって。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;get ゲッター名(){
   return this.#プロパティ名;
}

set セッター名(仮引数){
   this.#プロパティ名 = 仮引数;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;getとsetを用いた際に気をつけるべき点としてこの構文がメソッドの定義ではないということ。したがってgetやsetを使って定義されたゲッターとセッターをメソッドのように呼び出すとエラーが生じてしまう。&lt;/p&gt;
&lt;p&gt;getとsetを用いて定義されたゲッターとセッターは通常のデータ・プロパティのようにアクセスする必要がある。&lt;/p&gt;
&lt;pre class=&quot;note&quot;&gt;&lt;code&gt;const 変数名 = オブジェクト名.ゲッター名; // 取得する
オブジェクト名.セッター名 = 値; // 設定する&lt;/code&gt;&lt;/pre&gt;
&lt;script&gt;
function object_literal(){
   // オブジェクトを定義
   const circle = {
      radius : 30, // 半径
      line_width : 5, // 線の太さ
      stroke_color : &#39;blue&#39;, // 線の色
      fill_color : &#39;skyblue&#39;, // 塗りつぶす色
      // 円を描くメソッド（canvas要素ID、水平座標、垂直座標）
      draw : function(canvas_id,x,y) {
         // HTML5 Canvasの2DコンテキストのAPIを利用
         const canvas = document.getElementById(canvas_id);
         const ctx = canvas.getContext(&#39;2d&#39;);
         ctx.beginPath(); // パスを初期化
         // 円のパス（水平座標、垂直座標、半径、始点、終点）
         ctx.arc(x,y,circle.radius,0,Math.PI*2);
         ctx.closePath(); // パスを閉じる
         ctx.lineWidth = circle.line_width; // 線の太さ
         ctx.strokeStyle = circle.stroke_color; // 線の色
         ctx.stroke(); // 線を描く
         ctx.fillStyle = circle.fill_color; // 塗りつぶす色
         ctx.fill(); // 塗りつぶす
      }
   };

   // メソッドを呼び出す
   circle.draw(&#39;ol_circle&#39;,60,70);

   // 円の色を再設定
   circle.stroke_color = &#39;orange&#39;; // 線の色
   circle.fill_color = &#39;yellow&#39;; // 塗りつぶす色

   // その右に円を更に描く
   circle.draw(&#39;ol_circle&#39;,130,70);

   // 円の色を再々設定
   circle.stroke_color = &#39;red&#39;; // 線の色
   circle.fill_color = &#39;pink&#39;; // 塗りつぶす色

   // 更にその右に円を描く
   circle.draw(&#39;ol_circle&#39;,200,70);
}

object_literal();

function object_constructor(){
   // 空のオブジェクトを生成
   const circle = new Object();

   // 円の各種プロパティを設定
   circle.radius = 30; // 円の半径
   circle.line_width = 5; // 線の太さ
   circle.stroke_color = &#39;blue&#39;; // 線の色
   circle.fill_color = &#39;skyblue&#39;; // 塗りつぶす色
   //円を描くメソッド
   circle.draw = (canvasId,x,y) =&gt; {
      // HTML5 Canvasの2DコンテキストのAPIを利用
      const canvas = document.getElementById(canvasId);
      const ctx = canvas.getContext(&#39;2d&#39;);
      ctx.beginPath(); // パスの初期化
      // 円のパス（水平座標、垂直座標、半径、始点、終点）
      ctx.arc(x,y,circle.radius,0,Math.PI*2);
      // 線の太さ
      ctx.lineWidth = circle.line_width;
      // 線の色
      ctx.strokeStyle = circle.stroke_color;
      ctx.stroke(); // 線を描く
      // 塗りつぶす色
      ctx.fillStyle = circle.fill_color;
      ctx.fill(); // 塗りつぶす
   };

   // drawメソッドを呼び出して円を1つ描く
   circle.draw(&#39;oc_circle&#39;,60,60);

   // 円の色を再設定
   circle.stroke_color = &#39;orange&#39;;
   circle.fill_color = &#39;yellow&#39;;

   // 右隣に円を1つ描く
   circle.draw(&#39;oc_circle&#39;,130,60);

   // 円の色を再々設定
   circle.stroke_color = &#39;red&#39;;
   circle.fill_color = &#39;pink&#39;;

   // その右隣に円を1つ描く
   circle.draw(&#39;oc_circle&#39;,200,60);
}

object_constructor();

function factory_function(){
   // オブジェクトを定義
   function Circle(strokeColor,fillColor){
      // プライベートなプロパティ群
      let radius = 30; // 円の半径
      let line_width = 5; // 線の太さ
      let stroke_color = strokeColor || &#39;blue&#39;; // 線の色
      let fill_color = fillColor || &#39;skyblue&#39;; // 塗りつぶす色

      // オブジェクト・リテラルを返す
      return {
         // ゲッター
         getRadius : () =&gt; radius,
         getLineWidth : () =&gt; line_width,
         getStrokeColor : () =&gt; stroke_color,
         getFillColor : () =&gt; fill_color,

         // セッター
         setRadius : arg =&gt; radius = arg,
         setLineWidth : arg =&gt; line_width = arg,
         setStrokeColor : arg =&gt; stroke_color = arg,
         setFillColor : arg =&gt; fill_color = arg,
         
         // 円を描くメソッド（canvas要素ID、水平座標、垂直座標）
         draw : function(canvas_id,x,y){
            // HTML5 Canvasの2DコンテキストのAPIを利用
            const canvas = document.getElementById(canvas_id);
            const ctx = canvas.getContext(&#39;2d&#39;);
            ctx.beginPath(); // パスの初期化
            // 円のパス(水平座標、垂直座標、半径、始点、終点)
            ctx.arc(x,y,radius,0,Math.PI*2);
            ctx.closePath(); // パスを閉じる
            ctx.lineWidth = line_width; // 線の太さ
            ctx.strokeStyle = stroke_color; // 線の色
            ctx.stroke(); // 線を描く
            ctx.fillStyle = fill_color; // 塗りつぶす色
            ctx.fill(); // 塗りつぶす
         }
      };
   }

   // ファクトリ函数を呼び出してオブジェクトを作成
   const circle1 = Circle(); // 引数なし
   const circle2 = Circle(&#39;orange&#39;,&#39;yellow&#39;);
   const circle3 = Circle(&#39;red&#39;,&#39;pink&#39;);

   // drawメソッドを使って円を描く
   circle1.draw(&#39;ff_circle&#39;,60,60);
   circle2.draw(&#39;ff_circle&#39;,130,60);
   circle3.draw(&#39;ff_circle&#39;,200,60);

   // 線の色と塗りつぶす色を再設定
   circle1.setStrokeColor(&#39;black&#39;);
   circle2.setStrokeColor(&#39;green&#39;);
   circle3.setStrokeColor(&#39;saddlebrown&#39;);
   circle1.setFillColor(&#39;grey&#39;);
   circle2.setFillColor(&#39;lightgreen&#39;);
   circle3.setFillColor(&#39;peru&#39;);

   // 下隣の座標に円を描画
   circle1.draw(&#39;ff_circle&#39;,60,130);
   circle2.draw(&#39;ff_circle&#39;,130,130);
   circle3.draw(&#39;ff_circle&#39;,200,130);
}

factory_function();

function constructor_function(){
   // 円オブジェクトを定義
   function Circle(strokeColor,fillColor){
      // プライベートなプロパティ
      let radius = 30; // 円の半径
      let line_width = 5; // 線の太さ
      let stroke_color = strokeColor || &#39;blue&#39;; // 線の色
      let fill_color = fillColor || &#39;skyblue&#39;; // 塗りつぶす色

      // ゲッター
      this.getRadius = () =&gt; radius;
      this.getLineWidth = () =&gt; line_width;
      this.getStrokeColor = () =&gt; stroke_color;
      this.getFillColor = () =&gt; fill_color;

      // セッター
      this.setRadius = arg =&gt; radius = arg;
      this.setLineWidth = arg =&gt; line_width = arg;
      this.setStrokeColor = arg =&gt; stroke_color = arg;
      this.setFillColor = arg =&gt; fill_color = arg;
      
      // 円を描くメソッド（canvas要素のID、水平座標、垂直座標）
      this.draw = function(canvasId,x,y,){
         // HTML5 Canvasの2DコンテキストのAPIを使う
         const canvas = document.getElementById(canvasId);
         const ctx = canvas.getContext(&#39;2d&#39;);
         ctx.beginPath(); // パスを初期化
         // 円のパス（水平座標、垂直座標、半径、始点、終点）
         ctx.arc(x,y,radius,0,Math.PI*2);
         ctx.lineWidth = line_width; // 線の太さ
         ctx.strokeStyle = stroke_color; // 線の色
         ctx.stroke(); // 線を描く
         ctx.fillStyle = fill_color; // 塗りつぶす色
         ctx.fill(); // 塗りつぶす
      }
   }

      // 個々のオブジェクトを作成（インスタンス化）
      const circle1 = new Circle();
      const circle2 = new Circle(&#39;orange&#39;,&#39;yellow&#39;);
      const circle3 = new Circle(&#39;red&#39;,&#39;pink&#39;);

      // 円を描くメソッドを使う
      circle1.draw(&#39;cf_circle&#39;,60,60);
      circle2.draw(&#39;cf_circle&#39;,130,60);
      circle3.draw(&#39;cf_circle&#39;,200,60);

      // 円の半径を再設定
      circle1.setRadius(20);
      circle2.setRadius(20);
      circle3.setRadius(20);

      // 少し下の座標に円を描画
      circle1.draw(&#39;cf_circle&#39;,60,130);
      circle2.draw(&#39;cf_circle&#39;,130,130);
      circle3.draw(&#39;cf_circle&#39;,200,130);
      
}

constructor_function();

function class_declaration(){
   // クラスを定義
   class Circle{
      // プライベートなプロパティ
      #radius; // 円の半径
      #line_width; // 線の太さ
      #stroke_color; // 線の色
      #fill_color; // 塗りつぶす色
      
      // コンストラクター
      constructor(strokeColor,fillColor){
         this.#radius = 30;
         this.#line_width = 5;
         this.#stroke_color = strokeColor || &#39;blue&#39;;
         this.#fill_color = fillColor || &#39;skyblue&#39;;
      }

      // ゲッター
      get Radius(){return this.#radius;}
      get LineWidth(){return this.#line_width;}
      get StrokeColor(){return this.#stroke_color;}
      get FillColor(){return this.#fill_color;}

      // セッター
      set Radius(arg){this.#radius = arg;}
      set LineWidth(arg){this.#line_width = arg;}
      set StrokeColor(arg){this.#stroke_color = arg;}
      set FillColor(arg){this.#fill_color = arg;}

      // 円を描くメソッド（canvas要素のID、水平座標、垂直座標）
      draw(canvasId,x,y){
         // HTML5 Canvasの2DコンテキストのAPIを使う
         const canvas = document.getElementById(canvasId);
         const ctx = canvas.getContext(&#39;2d&#39;);
         ctx.beginPath(); // パスの初期化
         // 円のパス（水平座標、垂直座標、半径、始点、終点）
         ctx.arc(x,y,this.#radius,0,Math.PI*2);
         ctx.lineWidth = this.#line_width; // 線の太さ
         ctx.strokeStyle = this.#stroke_color; // 線の色
         ctx.stroke(); // 円を描く
         ctx.fillStyle = this.#fill_color; // 塗りつぶす色
         ctx.fill(); // 塗りつぶす
      }
   }

   // Circleクラスから個々の円オブジェクトを作成
   const circle1 = new Circle();
   const circle2 = new Circle(&#39;orange&#39;,&#39;yellow&#39;);
   const circle3 = new Circle(&#39;red&#39;,&#39;pink&#39;);

   // 円を描くメソッドを呼び出す
   circle1.draw(&#39;cd_circle&#39;,60,60);
   circle2.draw(&#39;cd_circle&#39;,130,60);
   circle3.draw(&#39;cd_circle&#39;,200,60);

   // 円の線の太さを再設定
   circle1.LineWidth = 8;
   circle2.LineWidth = 8;
   circle3.LineWidth = 8;

   // 少し下の座標に円を描く
   circle1.draw(&#39;cd_circle&#39;,60,130);
   circle2.draw(&#39;cd_circle&#39;,130,130);
   circle3.draw(&#39;cd_circle&#39;,200,130);
}
class_declaration();
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/5752907255115321690/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2022/03/javascript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/5752907255115321690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/5752907255115321690'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2022/03/javascript.html' title='JavaScriptでオブジェクトを作成する方法'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-6268779937669016129</id><published>2022-02-02T19:06:00.013+09:00</published><updated>2025-09-04T09:54:14.529+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Canvas"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><title type='text'>HTML5 Canvasで写像ダイアグラム（写像図）を描く</title><content type='html'>&lt;p&gt;HTML5 CanvasとJavaScriptを用いてHTMLドキュメントに数学の写像ダイアグラム（写像図）を描いてみた。この投稿はその備忘録。&lt;/p&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;ellipse20220201a&quot; width=&quot;250&quot; height=&quot;200&quot;&gt;
HTML5 CanvasかJavaScriptに未対応か無効になっています。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;写像ダイアグラムを描きたいHTMLドキュメント内の場所にcanvas要素を埋め込む必要がある。そのcanvas要素は例えば次のように記す。その際にid属性を指定することを忘れずに。HTML5 Canvasはこのidを受け取る。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;canvas id=&quot;mapping&quot; width=&quot;200&quot; height=&quot;200&quot;&amp;gt;
HTML5 CanvasかJavaScriptに未対応か無効になっています。
&amp;lt;/canvas&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;canvas要素のwidthとheightという属性はキャンバスの幅と高さを指定するもの。このサイズを適切に指定しないと描かれたオブジェクトがはみ出して見えなくなってしまうことがある。&lt;/p&gt;
&lt;h4&gt;楕円オブジェクト&lt;/h4&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;ellipse20220201b&quot; width=&quot;250&quot; height=&quot;200&quot;&gt;
HTML5 CanvasかJavaScriptに未対応か無効になっています。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;HTML5 Canvasを使って楕円を描くためにはellipse()というメソッドを用いることができる。このメソッドの引数は次の順番に指定する。オプションは省略することができる。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;ellipse(1,2,3,4,5,6,7,8);&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;楕円の中心の水平座標を指定。&lt;/li&gt;
&lt;li&gt;楕円の中心の垂直座標を指定。&lt;/li&gt;
&lt;li&gt;楕円の水平軸半径を非負の値で指定。&lt;/li&gt;
&lt;li&gt;楕円の垂直軸半径を非負の値で指定。&lt;/li&gt;
&lt;li&gt;楕円の水平軸の傾きを弧度法で指定。&lt;/li&gt;
&lt;li&gt;パスの始点を弧度法で指定。&lt;/li&gt;
&lt;li&gt;パスの終点を弧度法で指定。&lt;/li&gt;
&lt;li&gt;【オプション】楕円を描くパスの方向を反時計回りにしたい場合にtrueと指定。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ただしellipse()メソッドは古いウェブブラウザでは対応していない場合があるので要注意。&lt;/p&gt;
&lt;p&gt;次のJavaScriptのコードではコンストラクタ函数によって楕円クラスのようなものを定義している。そしてそれをインスタンス化して各々の楕円オブジェクトを作成し、コンストラクタ函数の中で定義した描画メソッドを呼び出すことで楕円を描くようにしている。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
// 楕円のコンストラクタ函数を定義
function ellipse(radiusX,radiusY,rotation,
   lineWidth,stColor,flColor){

    // プロパティを定義
   this.radiusX = radiusX; // 楕円の水平軸半径
   this.radiusY = radiusY; // 楕円の垂直軸半径
   this.rotation = rotation; // 楕円の水平軸の傾き
   this.startAngle = 0; // 線の始点
   this.endAngle = Math.PI / 180 * 360; // 線の終点
   this.lineWidth = lineWidth; // 線の太さ
   this.stColor = stColor; // 線の色
   this.flColor = flColor; // 塗りつぶす色

    // 楕円を描くメソッドを定義
   this.draw = function(canvasId,x,y){
      // HTML5 Canvasを利用する
      const Canvas = document.getElementById(canvasId)
      const Ctx = Canvas.getContext(&quot;2d&quot;);

      Ctx.beginPath(); // パスの初期化
      // ellipse()メソッドを利用
      Ctx.ellipse(x,y,this.radiusX,this.radiusY,
         this.rotation,this.startAngle,this.endAngle);
      Ctx.lineWidth = this.lineWidth; // 線の太さ
      Ctx.strokeStyle = this.stColor; // 線の色
      Ctx.stroke(); // 線を描く
      Ctx.fillStyle = this.flColor; // 塗りつぶす色
      Ctx.fill(); // 塗りつぶす
   }
}

// 各々のオブジェクトを作成（インスタンス化）
const Ellipse1 = new ellipse(50,80,0,2,&#39;blue&#39;,&#39;skyblue&#39;);
const Ellipse2 = new ellipse(50,80,0,2,&#39;red&#39;,&#39;pink&#39;);

// 定義したメソッドを呼び出して楕円を描画
Ellipse1.draw(mapping,60,110);
Ellipse2.draw(mapping,190,110);
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;コンストラクタ函数を利用してクラスのようなものを定義することができる。コンストラクタ函数が普通の函数と違うところは「this.変数名」によって変数を宣言しているところ。これによって「コンストラクタ函数名.変数名」という書式でコンストラクタ函数の外からアクセスできるようになる。これはすなわちオブジェクト指向言語のプロパティ（メンバ変数）のように機能する。プロパティに値を代入するには「コンストラクタ函数名.変数名 = リテラル;」という書式を使う。&lt;/p&gt;
&lt;p&gt;コンストラクタ函数は擬似的なクラスとして働くので、インスタンス化によって複数のオブジェクトをこれに基づいて作成することができる。そのためにはnewというキーワードを使って変数に代入する。&lt;/p&gt;
&lt;p&gt;コンストラクタ函数内では「this.メソッド名 = function(引数){...}」という書式を用いてメソッド（メンバ函数）のようなものを定義することができる。これも「コンストラクタ函数名.メソッド名();」という書式を用いてコンストラクタ函数の外から呼び出すことができる。&lt;/p&gt;
&lt;p&gt;楕円を定義したコンストラクタ函数では、それがインスタンス化されて各々のオブジェクトが作られるときに、楕円の中心点の水平座標と垂直座標、楕円の水平軸の傾き（ラジアン）、線の太さ、線の色、そして塗りつぶす色を引数として受け取るように定義した。&lt;/p&gt;
&lt;p&gt;楕円を定義したコンストラクタ函数の中で定義したdrawメソッドは、HTML5 Canvasによって楕円を描画するためのもの。このメソッドではそれが呼び出される際にcanvas要素のIDと楕円の中心点の座標を受け取るようにした。&lt;/p&gt;
&lt;p&gt;楕円を定義したコンストラクタ函数の中で「線の終点」を示すプロパティに代入されている「Math.PI / 180 * 360」という計算は、度数法の値360を弧度法の値に変換するためのもの。HTML5 Canvasのほうのellipse()メソッドは角度をラジアンで受け取るため。&lt;/p&gt;
&lt;h4&gt;ラベル・オブジェクト&lt;/h4&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;ellipse20220201c&quot; width=&quot;250&quot; height=&quot;200&quot;&gt;
HTML5 CanvasかJavaScriptに未対応か無効になっています。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;ラベルのオブジェクトを定義するコンストラクタ函数が次のコード。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
// 楕円のコンストラクタ函数を省略

// ラベルのコンストラクタ函数を定義
function lavel(text,color){

   // プロパティを定義
   this.text = text; // 文字列
   this.color = color; // 文字列の色

   // ラベルを描くメソッドを定義
   this.draw = function(canvasId,x,y){
      // HTML5 Canvasを利用する
      const Canvas = document.getElementById(canvasId);
      const Ctx = Canvas.getContext(&quot;2d&quot;);

     // フォントを設定
     Ctx.font = &#39;15px sans-serif&#39;;
     // 文字の水平位置を設定
     Ctx.textAlign = &quot;start&quot;;
     // 文字の垂直位置を設定
     Ctx.textBaseline = &quot;middle&quot;;
     // 塗りつぶしの色を設定
     Ctx.fillStyle = this.color;
     // 塗りつぶしの文字を描画、(文字列, x軸, y軸, 最大幅)
     Ctx.fillText(this.text,x,y,500);
   }
}

// 楕円をインスタンス化
const Ellipse1 = new ellipse(50,80,0,2,&#39;blue&#39;,&#39;skyblue&#39;);
const Ellipse2 = new ellipse(50,80,0,2,&#39;red&#39;,&#39;pink&#39;);

// ラベルをインスタンス化
const Lavel1 = new lavel(&#39;定義域&#39;,&#39;black&#39;);
const Lavel2 = new lavel(&#39;終域&#39;,&#39;black&#39;);

// 楕円を描くメソッドを使う
Ellipse1.draw(mapping,60,100);
Ellipse2.draw(mapping,190,100);

// ラベルを描くメソッドを使う
Lavel1.draw(mapping,35,10);
Lavel2.draw(mapping,175,10);
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ラベルを定義したコンストラクタ函数では、それがインスタンス化されるときにラベルの文字列とその文字の色を引数として受け取るようにした。&lt;/p&gt;
&lt;p&gt;ラベルを定義したコンストラクタ函数の中で定義したdrawメソッドでは、それが呼び出される際にcanvas要素のIDとラベルが描かれる場所を示す座標を受け取るようにした。&lt;/p&gt;
&lt;h4&gt;要素オブジェクト&lt;/h4&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;ellipse20220201d&quot; width=&quot;250&quot; height=&quot;200&quot;&gt;
HTML5 CanvasかJavaScriptに未対応か無効になっています。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;要素のオブジェクトを定義するコンストラクタ函数が次のコード。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
// 楕円のコンストラクタ函数を省略

// ラベルのコンストラクタ函数を省略

// 要素のコンストラクタ函数を定義
function element(text,color){

   // プロパティを定義
   this.text = text; // 文字列
   this.color = color; // 文字列の色

   // 要素を描くメソッドを定義
   this.draw = function(canvasId,x,y){

      // 座標プロパティ
      this.x = x; // 水平座標
      this.y = y; // 垂直座標

      // HTML5 Canvasを利用する
      const Canvas = document.getElementById(canvasId);
      const Ctx = Canvas.getContext(&quot;2d&quot;);        

      // フォントを設定
      Ctx.font = &#39;bold 15px sans-serif&#39;;
      // 文字の水平位置を設定
      Ctx.textAlign = &quot;start&quot;;
      // 文字の垂直位置を設定
      Ctx.textBaseline = &quot;middle&quot;;
      // 塗りつぶしの色を設定
      Ctx.fillStyle = this.color;
      // 塗りつぶしの文字を描画、(文字列,x軸,y軸,最大幅)
      Ctx.fillText(this.text,x,y,500);
   }
}

// 楕円をインスタンス化
const Ellipse1 = new ellipse(50,80,0,2,&#39;blue&#39;,&#39;skyblue&#39;);
const Ellipse2 = new ellipse(50,80,0,2,&#39;red&#39;,&#39;pink&#39;);

// ラベルをインスタンス化
const Lavel1 = new lavel(&#39;定義域&#39;,&#39;black&#39;);
const Lavel2 = new lavel(&#39;終域&#39;,&#39;black&#39;);

// 要素をインスタンス化
const Element1 = new element(&#39;a&#39;,&#39;black&#39;);
const Element2 = new element(&#39;b&#39;,&#39;black&#39;);
const Element3 = new element(&#39;d&#39;,&#39;black&#39;);
const Element4 = new element(&#39;e&#39;,&#39;black&#39;);
const Element5 = new element(&#39;f&#39;,&#39;black&#39;);
const Element6 = new eElement(&#39;α&#39;,&#39;black&#39;);
const Element7 = new element(&#39;β&#39;,&#39;black&#39;);
const Element8 = new element(&#39;γ&#39;,&#39;black&#39;);
const Element9 = new element(&#39;δ&#39;,&#39;black&#39;);
const Element10 = new element(&#39;ε&#39;,&#39;black&#39;);

// 楕円を描くメソッドを使う
Ellipse1.draw(mapping,60,100);
Ellipse2.draw(mapping,190,100);

// ラベルを描くメソッドを使う
Lavel1.draw(mapping,35,10);
Lavel2.draw(mapping,175,10);

// 要素を描くメソッドを使う
Element1.draw(mapping,55,40);
Element2.draw(mapping,55,70);
Element3.draw(mapping,55,100);
Element4.draw(mapping,55,130);
Element5.draw(mapping,55,160);
Element6.draw(mapping,185,40);
Element7.draw(mapping,185,70);
Element8.draw(mapping,185,100);
Element9.draw(mapping,185,130);
Element10.draw(mapping,185,160);
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要素を定義したコンストラクタ函数では、それがインスタンス化されるときに文字列と文字列の色をその引数として受け取るようにした。&lt;/p&gt;
&lt;p&gt;要素を定義したコンストラクタ函数の中で定義したdrawメソッドでは、それが呼び出される際にcanvas要素のIDと要素が描かれる場所を示す座標を受け取るようにした。&lt;/p&gt;
&lt;h4&gt;射オブジェクト&lt;/h4&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;canvas id=&quot;ellipse20220201e&quot; width=&quot;250&quot; height=&quot;200&quot;&gt;
HTML5 CanvasかJavaScriptに未対応か無効になっています。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;射のオブジェクトを定義するコンストラクタ函数が次のコード。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
// 楕円のコンストラクタ函数を省略

// ラベルのコンストラクタ函数を省略

// 要素のコンストラクタ函数を省略

// 射のコンストラクタ函数を定義
function arrow(alength,width,color){

   // プロパティを定義
  this.length = alength; // 長さ
  this.width = width; // 太さ
  this.color = color; // 色

   // 射を描くメソッドを定義
   this.draw = function(canvasId,tailX,tailY,headX,headY){
      // HTML5 Canvasを利用する
      const Canvas = document.getElementById(canvasId);
      const Ctx = Canvas.getContext(&quot;2d&quot;);

      Ctx.beginPath(); // パスを初期化
      Ctx.lineWidth =  this.width; // 線の幅
      Ctx.moveTo(tailX + 15, tailY); // 線の始点
      Ctx.lineTo(headX + -5, headY); // 線の終点
      Ctx.strokeStyle = this.color; // 線の色
      Ctx.stroke(); // 線を描く
   }
}

// 楕円をインスタンス化
const Ellipse1 = new ellipse(50,80,0,2,&#39;blue&#39;,&#39;skyblue&#39;);
const Ellipse2 = new ellipse(50,80,0,2,&#39;red&#39;,&#39;pink&#39;);

// ラベルをインスタンス化
const Lavel1 = new lavel(&#39;定義域&#39;,&#39;black&#39;);
const Lavel2 = new lavel(&#39;終域&#39;,&#39;black&#39;);

// 要素をインスタンス化
const Element1 = new element(&#39;a&#39;,&#39;black&#39;);
const Element2 = new element(&#39;b&#39;,&#39;black&#39;);
const Element3 = new element(&#39;d&#39;,&#39;black&#39;);
const Element4 = new element(&#39;e&#39;,&#39;black&#39;);
const Element5 = new element(&#39;f&#39;,&#39;black&#39;);
const Element6 = new element(&#39;α&#39;,&#39;black&#39;);
const Element7 = new element(&#39;β&#39;,&#39;black&#39;);
const Element8 = new element(&#39;γ&#39;,&#39;black&#39;);
const Element9 = new element(&#39;δ&#39;,&#39;black&#39;);
const Element10 = new element(&#39;ε&#39;,&#39;black&#39;);

// 射クラスのインスタンス化
const Arrow1 = new arrow(10,1,&#39;black&#39;);

// 楕円を描くメソッドを使う
Ellipse1.draw(mapping,60,100);
Ellipse2.draw(mapping,190,100);

// ラベルを描くメソッドを使う
Lavel1.draw(mapping,35,10);
Lavel2.draw(mapping,175,10);

// 要素を描くメソッドを使う
Element1.draw(mapping,55,40);
Element2.draw(mapping,55,70);
Element3.draw(mapping,55,100);
Element4.draw(mapping,55,130);
Element5.draw(mapping,55,160);
Element6.draw(mapping,185,40);
Element7.draw(mapping,185,70);
Element8.draw(mapping,185,100);
Element9.draw(mapping,185,130);
Element10.draw(mapping,185,160);

// 射を描くメソッドを使う
Arrow1.draw(mapping,Element1.x,Element1.y,
   Element6.x,Element6.y);
Arrow1.draw(mapping,Element2.x,Element2.y,
   Element6.x,Element6.y);
Arrow1.draw(mapping,Element3.x,Element3.y,
   Element7.x,Element7.y);
Arrow1.draw(mapping,Element4.x,Element4.y,
   Element9.x,Element9.y);
Arrow1.draw(mapping,Element5.x,Element5.y,
   Element10.x,Element10.y);
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;射を定義したコンストラクタ函数では、それがインスタンス化されるときに射の線の長さと太さと色を引数として受け取るようにした。&lt;/p&gt;
&lt;p&gt;射を定義したコンストラクタ函数の中で定義したdrawメソッドでは、それが呼び出される際にcanvas要素のID、そして始点となる部分の水平座標と垂直座標、さらに終点となる部分の水平座標と垂直座標を受け取るようにした。&lt;/p&gt;
&lt;p&gt;射の始点と終点の座標を指定するdrawメソッドの引数では要素オブジェクトのプロパティを利用している。&lt;/p&gt;
&lt;h4&gt;名前空間&lt;/h4&gt;
&lt;p&gt;最後に、変数名や函数名などが他のJavaSprictのコードと衝突しないように名前空間を作成した。JavaScriptでは正式に名前空間をサポートしていないけれども、函数や匿名函数やオブジェクト・リテラルを用いることでスコープを閉じることができるようなので、ここではそのために匿名函数を利用した。つまり、匿名函数でこれまで作成したコードをまるごと袋とじにした。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;(function(){ // 匿名函数を使う
// ここにこれまで作成した一連のコードを置く。
})(); &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これは特に即時実行函数式とか即時呼び出し函数式と呼ばれることがある。&lt;/p&gt;
&lt;h4&gt;関連投稿&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2022/02/html5-Canvas.html&quot;&gt;HTML5 Canvasで楕円を描く&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script&gt;
// このスクリプト全体を匿名函数で袋とじ
(function(){

   // 楕円オブジェクトのコンストラクタ函数
   function ellipse(radiusX,radiusY,rotation,
      lineWidth,stColor,flColor){

      // プロパティを定義
      this.radiusX = radiusX; // 楕円の水平軸半径
      this.radiusY = radiusY; // 楕円の垂直軸半径
      this.rotation = rotation; // 楕円の水平軸の傾き
      this.startAngle = 0; // 線の始点
      this.endAngle = Math.PI / 180 * 360; // 線の終点
      this.lineWidth = lineWidth; // 線の太さ
      this.stColor = stColor; // 線の色
      this.flColor = flColor; // 塗りつぶす色

      // 楕円を描くメソッドを定義
      this.draw = function(canvasId,x,y){
         // HTML5 Canvasを利用する手続き
         const Canvas = document.getElementById(canvasId)
         const Ctx = Canvas.getContext(&quot;2d&quot;);

         Ctx.beginPath(); // パスの初期化
         // ellipse()メソッドを利用
         Ctx.ellipse(x,y,this.radiusX,this.radiusY,
            this.rotation,this.startAngle,this.endAngle);
         Ctx.lineWidth = this.lineWidth; // 線の太さ
         Ctx.strokeStyle = this.stColor; // 線の色
         Ctx.stroke(); // 線を描く
         Ctx.fillStyle = this.flColor; // 塗りつぶす色
         Ctx.fill(); // 塗りつぶす
      }
   }

   // ラベルオブジェクトのコンストラクタ函数
   function lavel(text,color){

      // プロパティを定義
      this.text = text;
      this.color = color;

      // ラベルを描くメソッドを定義
      this.draw = function(canvasId,x,y){
         const Canvas = document.getElementById(canvasId);
         const Ctx = Canvas.getContext(&quot;2d&quot;);

         // フォントを設定
         Ctx.font = &#39;15px sans-serif&#39;;
         // 文字の水平位置を設定
         Ctx.textAlign = &quot;start&quot;;
         // 文字の垂直位置を設定
         Ctx.textBaseline = &quot;middle&quot;;
         // 塗りつぶしの色を設定
         Ctx.fillStyle = this.color;
         // 塗りつぶしの文字を描画、(文字列, x軸, y軸, 最大幅)
         Ctx.fillText(this.text,x,y,500);
      }
   }

   // 要素オブジェクトのコンストラクタ函数
   function element(text,color){

      // プロパティを定義
      this.text = text;
      this.color = color;

      // 要素を描くメソッドを定義
      this.draw = function(canvasId,x,y){

         // 座標プロパティ
         this.x = x;
         this.y = y;
         
         const Canvas = document.getElementById(canvasId);
         const Ctx = Canvas.getContext(&quot;2d&quot;);        

         // フォントを設定
         Ctx.font = &#39;bold 15px sans-serif&#39;;
         // 文字の水平位置を設定
         Ctx.textAlign = &quot;start&quot;;
         // 文字の垂直位置を設定
         Ctx.textBaseline = &quot;middle&quot;;
         // 塗りつぶしの色を設定
         Ctx.fillStyle = this.color;
         // 塗りつぶしの文字を描画、(文字列,x軸,y軸,最大幅)
         Ctx.fillText(this.text,x,y,500);
      }
   }

   // 射オブジェクトのコンストラクタ函数
   function arrow(alength,width,color){

      // プロパティを定義
      this.length = alength; // 射の長さ
      this.width = width; // 射の太さ
      this.color = color; // 射の色

      // 射を描くメソッドを定義
      this.draw = function(canvasId,tailX,tailY,headX,headY){
         const Canvas = document.getElementById(canvasId);
         const Ctx = Canvas.getContext(&quot;2d&quot;);

         Ctx.beginPath(); // パスを初期化
         Ctx.lineWidth =  this.width; // 線の太さ
         Ctx.moveTo(tailX + 15, tailY); // 線の始点
         Ctx.lineTo(headX + -5, headY); // 線の終点
         Ctx.strokeStyle = this.color; // 線の色
         Ctx.stroke(); // 線を描く
      }
   }

   /* canvas要素の函数群 */

   function canvas1(canvasId){
      /* クラスから各オブジェクトを作成 */
      // 楕円クラスのインスタンス化
      const Ellipse1 = new ellipse(50,80,0,2,&#39;blue&#39;,&#39;skyblue&#39;);
      const Ellipse2 = new ellipse(50,80,0,2,&#39;red&#39;,&#39;pink&#39;);
      // ラベルクラスのインスタンス化
      const Lavel1 = new lavel(&#39;定義域&#39;,&#39;black&#39;);
      const Lavel2 = new lavel(&#39;終域&#39;,&#39;black&#39;);
      // 要素クラスのインスタンス化
      const Element1 = new element(&#39;a&#39;,&#39;black&#39;);
      const Element2 = new element(&#39;b&#39;,&#39;black&#39;);
      const Element3 = new element(&#39;d&#39;,&#39;black&#39;);
      const Element4 = new element(&#39;e&#39;,&#39;black&#39;);
      const Element5 = new element(&#39;f&#39;,&#39;black&#39;);
      const Element6 = new element(&#39;α&#39;,&#39;black&#39;);
      const Element7 = new element(&#39;β&#39;,&#39;black&#39;);
      const Element8 = new element(&#39;γ&#39;,&#39;black&#39;);
      const Element9 = new element(&#39;δ&#39;,&#39;black&#39;);
      const Element10 = new element(&#39;ε&#39;,&#39;black&#39;);
      // 射クラスのインスタンス化
      const Arrow1 = new arrow(10,1,&#39;black&#39;);

      /* オブジェクト内のメソッドを呼び出して描画 */
      // 楕円を描くメソッドを使う
      Ellipse1.draw(canvasId,60,100);
      Ellipse2.draw(canvasId,190,100);
      // ラベルを描くメソッドを使う
      Lavel1.draw(canvasId,35,10);
      Lavel2.draw(canvasId,175,10);
      // 要素を描くメソッドを使う
      Element1.draw(canvasId,55,40);
      Element2.draw(canvasId,55,70);
      Element3.draw(canvasId,55,100);
      Element4.draw(canvasId,55,130);
      Element5.draw(canvasId,55,160);
      Element6.draw(canvasId,185,40);
      Element7.draw(canvasId,185,70);
      Element8.draw(canvasId,185,100);
      Element9.draw(canvasId,185,130);
      Element10.draw(canvasId,185,160);
      // 射を描くメソッドを使う
      Arrow1.draw(canvasId,Element1.x,Element1.y,
         Element6.x,Element6.y);
      Arrow1.draw(canvasId,Element2.x,Element2.y,
         Element8.x,Element8.y);
       Arrow1.draw(canvasId,Element3.x,Element3.y,
         Element7.x,Element7.y);
      Arrow1.draw(canvasId,Element4.x,Element4.y,
         Element7.x,Element7.y);
      Arrow1.draw(canvasId,Element5.x,Element5.y,
         Element9.x,Element9.y);
   }

   function canvas2(canvasId){
      // クラスから各オブジェクトを作成
      const Ellipse1 = new ellipse(50,80,0,2,&#39;blue&#39;,&#39;skyblue&#39;);
      const Ellipse2 = new ellipse(50,80,0,2,&#39;red&#39;,&#39;pink&#39;);

      // オブジェクト内のメソッドを呼び出して描画
      Ellipse1.draw(canvasId,60,110);
      Ellipse2.draw(canvasId,190,110);
   }

   function canvas3(canvasId){
      // クラスから各オブジェクトを作成
      const Ellipse1 = new ellipse(50,80,0,2,&#39;blue&#39;,&#39;skyblue&#39;);
      const Ellipse2 = new ellipse(50,80,0,2,&#39;red&#39;,&#39;pink&#39;);
      const Lavel1 = new lavel(&#39;定義域&#39;,&#39;black&#39;);
      const Lavel2 = new lavel(&#39;終域&#39;,&#39;black&#39;);

      // オブジェクト内のメソッドを呼び出して描画
      Ellipse1.draw(canvasId,60,100);
      Ellipse2.draw(canvasId,190,100);
      Lavel1.draw(canvasId,35,10);
      Lavel2.draw(canvasId,175,10);
   }

   function canvas4(canvasId){
      /* クラスから各オブジェクトを作成 */
      // 楕円クラスのインスタンス化
      const Ellipse1 = new ellipse(50,80,0,2,&#39;blue&#39;,&#39;skyblue&#39;);
      const Ellipse2 = new ellipse(50,80,0,2,&#39;red&#39;,&#39;pink&#39;);
      // ラベルクラスのインスタンス化
      const Lavel1 = new lavel(&#39;定義域&#39;,&#39;black&#39;);
      const Lavel2 = new lavel(&#39;終域&#39;,&#39;black&#39;);
      // 要素クラスのインスタンス化
      const Element1 = new element(&#39;a&#39;,&#39;black&#39;);
      const Element2 = new element(&#39;b&#39;,&#39;black&#39;);
      const Element3 = new element(&#39;d&#39;,&#39;black&#39;);
      const Element4 = new element(&#39;e&#39;,&#39;black&#39;);
      const Element5 = new element(&#39;f&#39;,&#39;black&#39;);
      const Element6 = new element(&#39;α&#39;,&#39;black&#39;);
      const Element7 = new element(&#39;β&#39;,&#39;black&#39;);
      const Element8 = new element(&#39;γ&#39;,&#39;black&#39;);
      const Element9 = new element(&#39;δ&#39;,&#39;black&#39;);
      const Element10 = new element(&#39;ε&#39;,&#39;black&#39;);

      /* オブジェクト内のメソッドを呼び出して描画 */
      // 楕円を描くメソッドを使う
      Ellipse1.draw(canvasId,60,100);
      Ellipse2.draw(canvasId,190,100);
      // ラベルを描くメソッドを使う
      Lavel1.draw(canvasId,35,10);
      Lavel2.draw(canvasId,175,10);
      // 要素を描くメソッドを使う
      Element1.draw(canvasId,55,40);
      Element2.draw(canvasId,55,70);
      Element3.draw(canvasId,55,100);
      Element4.draw(canvasId,55,130);
      Element5.draw(canvasId,55,160);
      Element6.draw(canvasId,185,40);
      Element7.draw(canvasId,185,70);
      Element8.draw(canvasId,185,100);
      Element9.draw(canvasId,185,130);
      Element10.draw(canvasId,185,160);
   }

   function canvas5(canvasId){
      /* クラスから各オブジェクトを作成 */
      // 楕円クラスのインスタンス化
      const Ellipse1 = new ellipse(50,80,0,2,&#39;blue&#39;,&#39;skyblue&#39;);
      const Ellipse2 = new ellipse(50,80,0,2,&#39;red&#39;,&#39;pink&#39;);
      // ラベルクラスのインスタンス化
      const Lavel1 = new lavel(&#39;定義域&#39;,&#39;black&#39;);
      const Lavel2 = new lavel(&#39;終域&#39;,&#39;black&#39;);
      // 要素クラスのインスタンス化
      const Element1 = new element(&#39;a&#39;,&#39;black&#39;);
      const Element2 = new element(&#39;b&#39;,&#39;black&#39;);
      const Element3 = new element(&#39;d&#39;,&#39;black&#39;);
      const Element4 = new element(&#39;e&#39;,&#39;black&#39;);
      const Element5 = new element(&#39;f&#39;,&#39;black&#39;);
      const Element6 = new element(&#39;α&#39;,&#39;black&#39;);
      const Element7 = new element(&#39;β&#39;,&#39;black&#39;);
      const Element8 = new element(&#39;γ&#39;,&#39;black&#39;);
      const Element9 = new element(&#39;δ&#39;,&#39;black&#39;);
      const Element10 = new element(&#39;ε&#39;,&#39;black&#39;);
      // 射クラスのインスタンス化
      const Arrow1 = new arrow(10,1,&#39;black&#39;);

      /* オブジェクト内のメソッドを呼び出して描画 */
      // 楕円を描くメソッドを使う
      Ellipse1.draw(canvasId,60,100);
      Ellipse2.draw(canvasId,190,100);
      // ラベルを描くメソッドを使う
      Lavel1.draw(canvasId,35,10);
      Lavel2.draw(canvasId,175,10);
      // 要素を描くメソッドを使う
      Element1.draw(canvasId,55,40);
      Element2.draw(canvasId,55,70);
      Element3.draw(canvasId,55,100);
      Element4.draw(canvasId,55,130);
      Element5.draw(canvasId,55,160);
      Element6.draw(canvasId,185,40);
      Element7.draw(canvasId,185,70);
      Element8.draw(canvasId,185,100);
      Element9.draw(canvasId,185,130);
      Element10.draw(canvasId,185,160);
      // 射を描くメソッドを使う
      Arrow1.draw(canvasId,Element1.x,Element1.y,
         Element6.x,Element6.y);
      Arrow1.draw(canvasId,Element2.x,Element2.y,
         Element6.x,Element6.y);
       Arrow1.draw(canvasId,Element3.x,Element3.y,
         Element7.x,Element7.y);
      Arrow1.draw(canvasId,Element4.x,Element4.y,
         Element9.x,Element9.y);
      Arrow1.draw(canvasId,Element5.x,Element5.y,
         Element10.x,Element10.y);
   }

// 各canvas函数を呼び出す
canvas1(&#39;ellipse20220201a&#39;);
canvas2(&#39;ellipse20220201b&#39;);
canvas3(&#39;ellipse20220201c&#39;);
canvas4(&#39;ellipse20220201d&#39;);
canvas5(&#39;ellipse20220201e&#39;);

})(); // 袋とじ用の匿名函数の終わり
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/6268779937669016129/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2022/02/html5-canvas_2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/6268779937669016129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/6268779937669016129'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2022/02/html5-canvas_2.html' title='HTML5 Canvasで写像ダイアグラム（写像図）を描く'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-3474257836607186161</id><published>2022-02-02T19:04:00.004+09:00</published><updated>2025-09-04T09:56:15.829+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Canvas"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><title type='text'>HTML5 Canvasで楕円を描く</title><content type='html'>&lt;p&gt;この投稿ではHTML5 CanvasとJavaScriptを用いてHTMLドキュメントに楕円を描くスクリプティング方法について記す。&lt;/p&gt;
&lt;h4&gt;楕円形を描く&lt;/h4&gt;
&lt;p&gt;HTML5 Canvasの2Dを使って楕円を描くにはellipse()というメソッドを用いることができる。このメソッドの引数は次の順番に指定する。最後のオプションは反時計回りに描きたい場合にだけ指定するもの。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;ellipse(1,2,3,4,5,6,7,8);&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;楕円の中心の水平座標を指定。&lt;/li&gt;
&lt;li&gt;楕円の中心の垂直座標を指定。&lt;/li&gt;
&lt;li&gt;楕円の長軸半径を非負の値で指定。&lt;/li&gt;
&lt;li&gt;楕円の短軸半径を非負の値で指定。&lt;/li&gt;
&lt;li&gt;楕円の長軸の傾きを弧度法で指定。&lt;/li&gt;
&lt;li&gt;パスの始点を弧度法で指定。&lt;/li&gt;
&lt;li&gt;パスの終点を弧度法で指定。&lt;/li&gt;
&lt;li&gt;【オプション】楕円を描くパスの方向を反時計回りにしたい場合にtrueと指定。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ただしHTML5 Canvasの2Dのellipse()メソッドは古いウェブブラウザでは対応していない場合があるので要注意。&lt;/p&gt;
&lt;p&gt;楕円を描くためのHTMLとJavaScriptのソースコードは次のとおり。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ja&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;楕円を描く&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;Canvas id=&quot;myEllipse&quot; width=&quot;200&quot; height=&quot;200&quot;&amp;gt;
HTML5 CanvasかJavaScriptに未対応か無効になっています。
&amp;lt;/Canvas&amp;gt;
&amp;lt;script&amp;gt;
// 角度をラジアンに変換する函数
function toRadian(degrees){
   return Math.PI / 180 * degrees;
}

// HTML5 Canvasを利用する手続き
const Canvas = document.getElementById(&quot;myEllipse&quot;)
const Ctx = Canvas.getContext(&quot;2d&quot;);

// 楕円を描く
Ctx.beginPath(); // パスの初期化
// 楕円メソッド(中心x,中心y,長軸半径,短軸半径,傾き,始点,終点)
Ctx.ellipse(100,60,80,50,toRadian(15),0,toRadian(360));
Ctx.lineWidth = 2; // 線の太さ
Ctx.strokeStyle = &#39;blue&#39;; // 枠の色
Ctx.stroke(); // 線を描く
Ctx.fillStyle = &#39;skyblue&#39;; // 塗りつぶす色
Ctx.fill(); // 塗りつぶす
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;Canvas id=&quot;ellipse20220130a&quot; width=&quot;200&quot; height=&quot;120&quot;&gt;
HTML5 CanvasかJavaScriptに未対応か無効になっています。
&lt;/Canvas&gt;
&lt;/div&gt;
&lt;p&gt;上の楕円は楕円の長軸を右下に15度傾けたのでellipse()の第5引数に15と指定した。ただしellipse()の引数には角度を弧度法による単位ラジアンで指定する必要があるため、この15度を弧度法での値に直す必要があった。&lt;/p&gt;
&lt;p&gt;toRadian()という函数は度数法の値を弧度法の値に変換するためのもの。度数法から弧度法への変換公式は次のとおり。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ ラジアン = \dfrac{\pi}{180} \times 角度 \]&lt;/div&gt;
&lt;p&gt;線の色はstrokeStyleというプロパティに=演算子を用いてカラーコードを代入することで指定することができる。塗りつぶす色はfillStyleというプロパティに代入して指定することができる。&lt;/p&gt;
&lt;p&gt;次の楕円は傾きを0度にしたもの。枠の色は赤、塗りつぶす色は桃色にしてみた。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;// 楕円を描く
Ctx.beginPath(); // パスの初期化
// 楕円メソッド(中心x,中心y,長軸半径,短軸半径,傾き,始点,終点)
Ctx.ellipse(100,100,80,50,toRadian(0),0,toRadian(360));
Ctx.lineWidth = 2; // 線の太さ
Ctx.strokeStyle = &#39;red&#39;; // 枠の色
Ctx.stroke(); // 線を描く
Ctx.fillStyle = &#39;pink&#39;; // 塗りつぶす色
Ctx.fill(); // 塗りつぶす&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;Canvas id=&quot;ellipse20220130b&quot; width=&quot;200&quot; height=&quot;120&quot;&gt;
HTML5 CanvasかJavaScriptに未対応か無効になっています。
&lt;/Canvas&gt;
&lt;/div&gt;
&lt;p&gt;ellipse()の引数の値をいろいろ変えてみて楕円の描画がどのように変化するか試してみると引数がどのように機能するかを掴むことができる。&lt;/p&gt;
&lt;p&gt;次の楕円は長軸の半径をもう少し長くしてみた。傾きには負の値-15度を指定してみた。枠の色は緑、塗りつぶす色は黄色とした。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;// 楕円を描く
Ctx.beginPath(); // パスの初期化
// 楕円メソッド(中心x,中心y,長軸半径,短軸半径,傾き,始点,終点)
Ctx.ellipse(100,60,100,50,toRadian(-15),0,toRadian(360));
Ctx.lineWidth = 2; // 線の太さ
Ctx.strokeStyle = &#39;green&#39;; // 線の色
Ctx.stroke(); // 線を描く
Ctx.fillStyle = &#39;yellow&#39;; // 塗りつぶす色
Ctx.fill(); // 塗りつぶす&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;text-align: center&quot;&gt;
&lt;Canvas id=&quot;ellipse20220130c&quot; width=&quot;200&quot; height=&quot;120&quot;&gt;
HTML5 CanvasかJavaScriptに未対応か無効になっています。
&lt;/Canvas&gt;
&lt;/div&gt;
&lt;h4&gt;関連投稿&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2022/02/html5-Canvas_2.html&quot;&gt;HTML5 Canvasで写像ダイアグラム（写像図）を描く&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;script&gt;
// このスクリプト全体を匿名函数で袋とじ
(function(){

/* ここから楕円を描くコード */

   // 楕円を描く函数drawEllipse()
   function drawEllipse(
      CanvasId, // CanvasのID
      x, // 楕円の中心のx座標
      y, // 楕円の中心のy座標
      radiusX, // 長軸半径
      radiusY, // 短軸半径
      rotation, // 楕円の傾き
      startAngle, // 描画始点
      endAngle, // 描画終点
      lineWidth, // 線の太さ
      stColor, // 線の色
      flColor // 塗りつぶす色
      ){

      // 角度をラジアンに変換する函数
      function toRadian(degrees) {
         return Math.PI / 180 * degrees;
      }
   
      // HTML5 Canvasを利用する手続き
      const Canvas = document.getElementById(CanvasId)
      const Ctx = Canvas.getContext(&quot;2d&quot;);

      // 楕円を描く
      Ctx.beginPath(); // パスの初期化
      Ctx.ellipse(x,y,radiusX,radiusY,toRadian(rotation),
         startAngle,toRadian(endAngle),
         lineWidth,stColor,flColor); // 楕円メソッド
      Ctx.lineWidth = lineWidth; // 線の太さ
      Ctx.strokeStyle = stColor; // 線の色
      Ctx.stroke(); // 描画
      Ctx.fillStyle = flColor; // 塗りつぶす色
      Ctx.fill(); // 塗りつぶす
   }

   // 楕円を描く函数drawEllipse()を呼び出す
   drawEllipse(&#39;ellipse20220130a&#39;,100,60,80,50,15,0,360,2,&#39;blue&#39;,&#39;skyblue&#39;);
   drawEllipse(&#39;ellipse20220130b&#39;,100,60,80,50,0,0,360,2,&#39;red&#39;,&#39;pink&#39;);
   drawEllipse(&#39;ellipse20220130c&#39;,100,60,100,50,-15,0,360,2,&#39;green&#39;,&#39;yellow&#39;);

})(); // 袋とじ用の匿名函数の終わり
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/3474257836607186161/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2022/02/html5-canvas.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/3474257836607186161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/3474257836607186161'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2022/02/html5-canvas.html' title='HTML5 Canvasで楕円を描く'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-8547731065509777974</id><published>2021-12-11T13:21:00.018+09:00</published><updated>2025-09-05T11:01:12.404+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GNU Octave"/><category scheme="http://www.blogger.com/atom/ns#" term="Julia"/><category scheme="http://www.blogger.com/atom/ns#" term="Maxima"/><category scheme="http://www.blogger.com/atom/ns#" term="Python3"/><category scheme="http://www.blogger.com/atom/ns#" term="R言語"/><category scheme="http://www.blogger.com/atom/ns#" term="数学"/><category scheme="http://www.blogger.com/atom/ns#" term="線形代数"/><category scheme="http://www.blogger.com/atom/ns#" term="行列"/><title type='text'>ガウスの消去法（掃き出し法） 行基本変形 行簡約階段形</title><content type='html'>&lt;p&gt;この投稿は連立n元一次方程式を解くためのアルゴリズムの1つであるガウスの消去法（通称：掃き出し法）について簡単にまとめたもの。逆行列を用いた解法にも若干触れた。また、R言語、GNU Octave、Maxima、Python 3、Juliaを用いた連立一次方程式の解き方についても記した。&lt;/p&gt;
&lt;p&gt;ガウスの消去法をプログラミング言語でコーディングすることについてはこの投稿では扱わなかった。それについてはまた別の機会に。&lt;/p&gt;
&lt;h4&gt;連立n元一次方程式とは&lt;/h4&gt;
&lt;p&gt;連立一次方程式は英語ではa system of linear equationsと呼ばれている。日本語に直訳すると線形方程式系。&lt;/p&gt;
&lt;p&gt;n元とは変数（未知数）がn個あること。一次とは代数式の次数が1つのこと。つまり方程式を構成する代数式の各項が最大で1つの変数しか持っていないこと。代数式とは数学のお馴染みの文字式のこと。代数式には単項式と二項式と多項式がある。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ 2x + 3y \quad 1次式 \]
\[ 2x + y^2 \quad 2次式 \]
\[ 2x^2y + 5y \quad 3次式 \]&lt;/div&gt;
&lt;p&gt;方程式とは2つの代数式の等しい関係を等号で表したもの。&lt;/p&gt;
&lt;p&gt;一次方程式を直交座標系に描くと直線になる。したがって線形方程式とも呼ばれている。&lt;/p&gt;
&lt;div class=&quot;textcenter&quot;&gt;
&lt;canvas id=&quot;chartOfEquation20211210&quot; width=&quot;300&quot; height=&quot;200&quot;&gt;
HTML5 Canvasが有効ではありません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;連立一次方程式は一次方程式の集合なので、同じ直交座標系に直線に複数描かれ、それらの直線同士が交わるところがあればそこが連立一次方程式の解になる。&lt;/p&gt;
&lt;p&gt;例えば&lt;a href=&quot;https://www.geogebra.org/&quot;&gt;GeoGebra&lt;/a&gt;というアプリケーション・ソフトウェアを使うと、これを視覚化してくれる。GeoGebraの入力欄に連立一次方程式を構成している各々の一次方程式を入力すると直交座標系に直線を描いてくれる。&lt;/p&gt;
&lt;p&gt;描かれた直線同士が互いに交わった点の座標がその連立一次方程式の解。&lt;/p&gt;
&lt;div class=&quot;textcenter&quot;&gt;
&lt;canvas id=&quot;chartOfSystemOfEquations20211210a&quot; width=&quot;300&quot; height=&quot;200&quot;&gt;
HTML5 Canvasが有効ではありません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;直線同士が完全に平行になって交わるところがなければその連立一次方程式は解を持たない。&lt;/p&gt;
&lt;div class=&quot;textcenter&quot;&gt;
&lt;canvas id=&quot;chartOfSystemOfEquations20211210b&quot; width=&quot;300&quot; height=&quot;200&quot;&gt;
HTML5 Canvasが有効ではありません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;直線同士が完全に重なっている場合はその連立一次方程式は無数の解を持つ。&lt;/p&gt;
&lt;div class=&quot;textcenter&quot;&gt;
&lt;canvas id=&quot;chartOfSystemOfEquations20211210c&quot; width=&quot;300&quot; height=&quot;200&quot;&gt;
HTML5 Canvasが有効ではありません。
&lt;/canvas&gt;
&lt;/div&gt;
&lt;p&gt;ちなみにGeoGebraはJava言語の仮想マシンがインストールされた複数のプラットフォームで動作し、オープンソースでかつ多言語対応。&lt;/p&gt;
&lt;h4&gt;連立n元一次方程式を行列で表す&lt;/h4&gt;
&lt;p&gt;例えば次のような連立3元一次方程式があったとする。\( a_1, a_2, \cdots, a_8 \)は係数、\( x_1, x_2, x_3 \)は変数、\( b_1, b_2, b_3 \)は定数。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
a_1x_1 &amp;amp;+&amp;amp; a_2x_2 &amp;amp;+&amp;amp; a_3x_3 &amp;amp;=&amp;amp; b_1 \\
a_4x_1 &amp;amp;+&amp;amp; a_5x_2 &amp;amp;+&amp;amp; a_6x_3 &amp;amp;=&amp;amp; b_2 \\
&amp;amp;&amp;amp; a_7x_2 &amp;amp;+&amp;amp; a_8x_3 &amp;amp;=&amp;amp; b_3
\end{cases} \tag{1} \]&lt;/div&gt;
&lt;p&gt;この連立一次方程式(1)の係数だけを取り出し、それを行列にして表現してみる。各変数に掛けられてある各係数を連立一次方程式の並び順とまったく同じ順番に並べればよい。そうすると次のような行列ができあがる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
a_1x_1 &amp;amp;+&amp;amp; a_2x_2 &amp;amp;+&amp;amp; a_3x_3 &amp;amp;=&amp;amp; b_1 \\
a_4x_1 &amp;amp;+&amp;amp; a_5x_2 &amp;amp;+&amp;amp; a_6x_3 &amp;amp;=&amp;amp; b_2 \\
&amp;amp;&amp;amp; a_7x_2 &amp;amp;+&amp;amp; a_8x_3 &amp;amp;=&amp;amp; b_3
\end{cases} \]
\[ \updownarrow \]
\[ A = \begin{pmatrix}
a_1 &amp;amp; a_2 &amp;amp; a_3 \\
a_4 &amp;amp; a_5 &amp;amp; a_6 \\
0 &amp;amp; a_7 &amp;amp; a_8
\end{pmatrix} \] &lt;/div&gt;
&lt;p&gt;この\( A \)という行列は係数行列と呼ばれているもの。その第1列が変数\( x \)の係数、第2列が変数\( y \)の係数、第3列が変数\( z \)の係数。また、係数と変数（未知数）共に欠けている項が0になることに要注意。&lt;/p&gt;
&lt;p&gt;この係数行列\( A \)に連立一次方程式の右辺にある定数を更に含めると次のような行列ができあがる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
a_1x_1 &amp;amp;+&amp;amp; a_2x_2 &amp;amp;+&amp;amp; a_3x_3 &amp;amp;=&amp;amp; b_1 \\
a_4x_1 &amp;amp;+&amp;amp; a_5x_2 &amp;amp;+&amp;amp; a_6x_3 &amp;amp;=&amp;amp; b_2 \\
&amp;amp;&amp;amp; a_7x_2 &amp;amp;+&amp;amp; a_8x_3 &amp;amp;=&amp;amp; b_3
\end{cases} \]
\[ \updownarrow \]
\[ \tilde{A} = \left(\begin{array}{ccc|c}
a_1 &amp;amp; a_2 &amp;amp; a_3 &amp;amp; b_1 \\
a_4 &amp;amp; a_5 &amp;amp; a_6 &amp;amp; b_2 \\
0 &amp;amp; a_7 &amp;amp; a_8 &amp;amp; b_3
\end{array}\right) \]&lt;/div&gt;
&lt;p&gt;この\( \tilde{A} \)という行列は拡大係数行列または拡大行列と呼ばれているもの。|（パイプ）の右側にある列ベクトル\( (b_1\ b_2\  b_3) \)は連立一次方程式の右辺ベクトルまたは定数項べクトルと呼ばれることがある。&lt;/p&gt;
&lt;p&gt;上記の連立一次方程式(1)を係数行列と列ベクトルを用いて行列方程式\( A\vec{x} = \vec{b} \)として表すと、次のようになる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
a_1x_1 &amp;amp;+&amp;amp; a_2x_2 &amp;amp;+&amp;amp; a_3x_3 &amp;amp;=&amp;amp; b_1 \\
a_4x_1 &amp;amp;+&amp;amp; a_5x_2 &amp;amp;+&amp;amp; a_6x_3 &amp;amp;=&amp;amp; b_2 \\
&amp;amp;&amp;amp; a_7x_2 &amp;amp;+&amp;amp; a_8x_3 &amp;amp;=&amp;amp; b_3
\end{cases} \]
\[ \updownarrow \]
\[ \begin{pmatrix}
a_1 &amp;amp; a_2 &amp;amp; a_3 \\
a_4 &amp;amp; a_5 &amp;amp; a_6 \\
0 &amp;amp; a_7 &amp;amp; a_8
\end{pmatrix}
\begin{pmatrix}
x_1 \\
x_2 \\
x_3
\end{pmatrix}
=
\begin{pmatrix}
b_1 \\
b_2 \\
b_3
\end{pmatrix}
\]&lt;/div&gt;
&lt;p&gt;同様にしてベクトル方程式として表すと次のようになる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
a_1x_1 &amp;amp;+&amp;amp; a_2x_2 &amp;amp;+&amp;amp; a_3x_3 &amp;amp;=&amp;amp; b_1 \\
a_4x_1 &amp;amp;+&amp;amp; a_5x_2 &amp;amp;+&amp;amp; a_6x_3 &amp;amp;=&amp;amp; b_2 \\
&amp;amp;&amp;amp; a_7x_2 &amp;amp;+&amp;amp; a_8x_3 &amp;amp;=&amp;amp; b_3
\end{cases} \]
\[ \updownarrow \]
\[ x_1
\begin{pmatrix}
a_1 \\
a_4 \\
0
\end{pmatrix}
+ x_2
\begin{pmatrix}
a_2 \\
a_5 \\
a_7
\end{pmatrix}
+ x_3
\begin{pmatrix}
a_3 \\
a_6 \\
a_8
\end{pmatrix}
=
\begin{pmatrix}
b_1 \\
b_2 \\
b_3
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;ちなみに、各変数項に定数を乗算してそれらを加算した式は線形結合と呼ばれている。またの名を一次結合。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \sum_{i=1}^n a_ix_i = a_1x_1 + a_2x_2 + a_3x_3 + \cdots + a_nx_n \]&lt;/div&gt;
&lt;p&gt;では以上の操作の具体例を挙げてみる。例えば次のような連立一次方程式があったとする。xとyがその値を知りたい変数、つまり未知数。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
2x - y = 5 \\
x - y = 3
\end{cases} \tag{2} \]&lt;/div&gt;
&lt;p&gt;数学の表記上の理由で言うまでもなく次の2つの連立一次方程式が等しいことは自明。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
2x - y = 5 \\
x - y = 3
\end{cases}
\leftrightarrow
\begin{cases}
2x + (-1y) = 5 \\
1x + (-1y) = 3
\end{cases} \]&lt;/div&gt;
&lt;p&gt;連立一次方程式(2)の係数行列Aと拡大係数行列\( \tilde{A} \)はそれぞれ次のように表すことができる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A = \begin{pmatrix}
2 &amp;amp; -1 \\
1 &amp;amp; -1
\end{pmatrix} \]
\[ \tilde{A} = \left(\begin{array}{cc|c}
2 &amp;amp; -1 &amp;amp; 5 \\
1 &amp;amp; -1 &amp;amp; 3
\end{array}\right) \]&lt;/div&gt;
&lt;p&gt;係数行列と列ベクトルを用いて行列方程式\( A\vec{x} = \vec{b} \)として表すと次のようになる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
2 &amp;amp; -1 \\
1 &amp;amp; -1
\end{pmatrix}
\begin{pmatrix}
x \\
y
\end{pmatrix}
=
\begin{pmatrix}
5 \\
3
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;次のように線形結合のベクトル方程式としても表現できる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ x
\begin{pmatrix}
2 \\
1
\end{pmatrix}
+ y
\begin{pmatrix}
-1 \\
-1
\end{pmatrix}
=
\begin{pmatrix}
5 \\
3
\end{pmatrix} \]&lt;/div&gt;
&lt;h4&gt;掃き出し法、ガウスの消去法&lt;/h4&gt;
&lt;p&gt;連立一次方程式を解くためのアルゴリズムにガウスの消去法と呼ばれているものがある。ガウスの消去法は日本では掃き出し法という通称で呼ばれていることが多い。&lt;/p&gt;
&lt;p&gt;連立一次方程式の解を掃き出し法によって求めるには、まず連立一次方程式を拡大係数行列の形に直した後、その拡大係数行列が行簡約階段形と呼ばれる形になるように行基本変形と呼ばれる操作を繰り返す。&lt;/p&gt;
&lt;p&gt;行簡約階段形は行既約階段形とも呼ばれている。&lt;/p&gt;
&lt;p&gt;拡大係数行列の左辺、つまり係数行列の部分が正方行列であるとき、行簡約階段形は単位行列の形になる。正方行列とは行列の列と行とが同じ数であること。&lt;/p&gt;
&lt;p&gt;行簡約階段形や単位行列がどういう行列の形であるかについては後ほど詳しく記す。&lt;/p&gt;
&lt;p&gt;行基本変形と呼ばれている操作には次の3種類がある。ただしここでの表記の順番はその手順とは無関係。&lt;/p&gt;
&lt;ul&gt;
ある拡大係数行列の成分に対して
&lt;li&gt;ある行を別の行と交換すること、&lt;/li&gt;
&lt;li&gt;ある行の全成分に0でない定数を掛けること、&lt;/li&gt;
&lt;li&gt;ある行を定数倍した値を別の行に加えること。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次のようなバージョンもある。&lt;/p&gt;
&lt;ul&gt;
ある拡大係数行列の成分に対して
&lt;li&gt;ある行を別の行と交換すること、&lt;/li&gt;
&lt;li&gt;ある行の全成分を0でない定数で割ること、&lt;/li&gt;
&lt;li&gt;ある行を定数倍した値を別の行から引くこと。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;掛け算が割り算に、足し算が引き算に置き換わっているが、割り算が分数を掛けることであり引き算が負数を足すことであることを思い起こせば、掛け算と割り算、足し算と引き算とが互換性を持つことを理解できる。&lt;/p&gt;
&lt;h4&gt;例題1.&lt;/h4&gt;
&lt;p&gt;次のような連立一次方程式があったとする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
2x - y = 5 \\
x - y = 3
\end{cases} \tag{2} \]&lt;/div&gt;
&lt;p&gt;この連立一次方程式(2)を掃き出し法によって解くと次のようになる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;連立一次方程式(2)を拡大係数行列として表す。
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
2x - y = 5 \\
x - y = 3
\end{cases}
\leftrightarrow
\left(\begin{array}{cc|c}
2 &amp;amp; -1 &amp;amp; 5 \\
1 &amp;amp; -1 &amp;amp; 3
\end{array}\right) \]&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;拡大係数行列の変数項の部分、つまり係数行列の部分を上記の3種類の行基本変形を用いて次のような形にするにはどうしたらよいかを考える。
&lt;div class=&quot;math&quot;&gt;\[ \left(\begin{array}{cc|c}
1 &amp;amp; 0 &amp;amp; ? \\
0 &amp;amp; 1 &amp;amp; ?
\end{array}\right) \]&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;拡大係数行列の左上端の成分（この例題では2）はピボットと呼ばれている。このピボットをとにかく1にすると便利なので、行基本変形1を適用して第1行と第2行を交換してみる。\( R_n \)は拡大係数行列の第n行を指している。
&lt;div class=&quot;math&quot;&gt;\[ R_1 \leftrightarrows R_2 \]
\[ \left(\begin{array}{cc|c}
2 &amp;amp; -1 &amp;amp; 5 \\
1 &amp;amp; -1 &amp;amp; 3
\end{array}\right)
\rightarrow
\left(\begin{array}{cc|c}
1 &amp;amp; -1 &amp;amp; 3 \\
2 &amp;amp; -1 &amp;amp; 5
\end{array}\right) \]&lt;/div&gt;
ピボットを1にすることができた。&lt;/li&gt;
&lt;li&gt;行基本変形3を適用し、第1行を-2倍し、第2行に加算してみる。
&lt;div class=&quot;math&quot;&gt;\[ \left(\begin{array}{cc|c}
1 &amp;amp; -1 &amp;amp; 3 \\
2 &amp;amp; -1 &amp;amp; 5
\end{array}\right) \]
\[ \downarrow \]
\[ -2R_1 + R_2 \rightarrow R_2 \]
\[ \left(\begin{array}{cc|c}
1 &amp;amp; -1 &amp;amp; 3 \\
-2 \cdot 1 + 2 &amp;amp; -2 \cdot -1 + (-1) &amp;amp; -2 \cdot 3 + 5
\end{array}\right) \]
\[ \downarrow \]
\[ \left(\begin{array}{cc|c}
1 &amp;amp; -1 &amp;amp; 3 \\
0 &amp;amp; 1 &amp;amp; -1
\end{array}\right) \]&lt;/div&gt;
第2行第2列の成分もこれで1にすることができた。&lt;/li&gt;
&lt;li&gt;行基本変形3を適用し、第2行を1倍し、つまりそのまま第1行に加算してみる。
&lt;div class=&quot;math&quot;&gt;\[ \left(\begin{array}{cc|c}
1 &amp;amp; -1 &amp;amp; 3 \\
0 &amp;amp; 1 &amp;amp; -1
\end{array}\right) \]
\[ \downarrow \]
\[ R_2 + R_1 \rightarrow R_1 \]
\[ \left(\begin{array}{cc|c}
0 + 1 &amp;amp; 1 + (-1) &amp;amp; -1 + 3 \\
0 &amp;amp; 1 &amp;amp; -1
\end{array}\right) \]
\[ \downarrow \]
\[ \left(\begin{array}{cc|c}
1 &amp;amp; 0 &amp;amp; 2 \\
0 &amp;amp; 1 &amp;amp; -1
\end{array}\right) \]&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;拡大係数行列の左辺、つまり係数行列の部分が、対角線上に1が並ぶ単位行列の形になったのでこれで完了。連立一次方程式(2)の解は
&lt;div class=&quot;math&quot;&gt;\[ \left(\begin{array}{cc|c}
1 &amp;amp; 0 &amp;amp; 2 \\
0 &amp;amp; 1 &amp;amp; -1
\end{array}\right)
\leftrightarrow
\begin{cases}
x = 2 \\
y = -1
\end{cases} \]&lt;/div&gt;
と求まった。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h4&gt;R言語で連立一次方程式を解く&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://www.r-project.org/&quot;&gt;R&lt;/a&gt;で答え合わせをしてみる。Rで連立一次方程式を解くためには、matrix()とc()とで係数行列と定数項の列ベクトルをまず作成する。そしてsolve()に両者を渡せばその連立一次方程式の解が返ってくる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt; A = matrix(c(2,-1,1,-1),nrow=2,ncol=2,byrow=T)
&amp;gt; A
     [,1] [,2]
[1,]    2   -1
[2,]    1   -1
&amp;gt; b = matrix(c(5,3),nrow=2,ncol=1,byrow=T)
&amp;gt; b
     [,1]
[1,]    5
[2,]    3
&amp;gt; solve(A,b)
     [,1]
[1,]    2
[2,]   -1
&amp;gt; q()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2と-1が返ってきた。&lt;/p&gt;
&lt;p&gt;rref()を利用することもできる。MATLABの函数を利用するため、pracmaというパッケージが必要。Debian GNU/Linuxではr-cran-pracmaというdebパッケージをインストールする必要があった。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt; A = matrix(c(2,-1,5,1,-1,3),nrow=2,ncol=3,byrow=T)
&amp;gt; A
     [,1] [,2] [,3]
[1,]    2   -1    5
[2,]    1   -1    3
&amp;gt; library(pracma)
&amp;gt; rref(A)
     [,1] [,2] [,3]
[1,]    1    0    2
[2,]    0    1   -1
&amp;gt; q()&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;GNU Octaveで連立一次方程式を解く&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://www.octave.org/&quot;&gt;GNU Octave&lt;/a&gt;では係数行列Aと定数項の列ベクトルbを作成してlinsolve()に渡せば連立一次方程式の解が返ってくる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;octave:1&amp;gt; A = [2 -1; 1 -1]
A =

   2  -1
   1  -1

octave:2&amp;gt; b = [5;3]
b =

   5
   3

octave:3&amp;gt; linsolve(A,b)
ans =

   2
  -1

octave:4&amp;gt; quit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;やはり同様に2と-1が返ってきた。&lt;/p&gt;
&lt;p&gt;MATLAB互換なのでGNU Octaveには標準でrref()がある。拡大係数行列を作ってrref()に渡せば、ガウス＝ジョルダンの消去法によって拡大係数行列からその行簡約階段形を生成してくれる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt; A = [2 -1 5; 1 -1 3]
A =

   2  -1   5
   1  -1   3

&amp;gt;&amp;gt; rref(A)
ans =

   1   0   2
   0   1  -1

&amp;gt;&amp;gt; quit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第3列、つまり連立一次方程式の定数項によって構成された列ベクトルの部分が2と-1であることが分かる。この方法でも同じ解を得ることができた。&lt;/p&gt;
&lt;h4&gt;Python3で連立一次方程式を解く&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://www.python.org/&quot;&gt;Python 3&lt;/a&gt;ではnumpy.linalg.solve()を利用する。そのためにはNumpyをimportする必要がある。Python3で連立一次方程式を解く手順は次のとおり。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import numpy as np
&amp;gt;&amp;gt;&amp;gt; A = np.matrix(&#39;2,-1; 1,-1&#39;)
&amp;gt;&amp;gt;&amp;gt; print(A)
[[ 2 -1]
 [ 1 -1]]
&amp;gt;&amp;gt;&amp;gt; b = np.matrix(&#39;5; 3&#39;)
&amp;gt;&amp;gt;&amp;gt; print(b)
[[5]
 [3]]
&amp;gt;&amp;gt;&amp;gt; x = np.linalg.solve(A,b)
&amp;gt;&amp;gt;&amp;gt; print(x)
[[ 2.]
 [-1.]]
&amp;gt;&amp;gt;&amp;gt; quit()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Python 3でも同じく2と-1となった。&lt;/p&gt;
&lt;h4&gt;Maximaで連立一次方程式を解く&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://maxima.sourceforge.io/&quot;&gt;Maxima&lt;/a&gt;で連立一次方程式を解くには、各々の変数に連立一次方程式を構成する各々の一次方程式を割り当て、その各々の変数とその連立一次方程式の未知数をsolve()に次のようにして共に渡す。eqn1とeqn2は方程式を割り当てた任意の変数名。乗法の演算子*はMaximaでは入力時に省略できないので忘れずに。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;(%i1) eqn1: 2*x - y = 5;
(%o1)                             2 x - y = 5
(%i2) eqn2: x - y = 3;
(%o2)                              x - y = 3
(%i3) solve([eqn1,eqn2],[x,y]);
(%o3)                         [[x = 2, y = - 1]]
(%i4) quit();&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Juliaで連立一次方程式を解く&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://julialang.org/&quot;&gt;Julia&lt;/a&gt;では係数行列の逆行列を用いて連立一次方程式を解いてみる。inv()に行列を渡すとその逆行列が返ってくる。そして係数行列の逆行列と定数項の列ベクトルの内積を求めるか、\という演算子を使う。つまり次のようにして連立一次方程式を解くことができる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;julia&amp;gt; A = [2 -1; 1 -1]
2×2 Array{Int64,2}:
 2  -1
 1  -1

julia&amp;gt; b = [5; 3]
2-element Array{Int64,1}:
 5
 3

julia&amp;gt; inv(A) * b
2-element Array{Float64,1}:
  2.0
 -1.0

julia&amp;gt; A \ b
2-element Array{Float64,1}:
  2.0
 -1.0

julia&amp;gt; exit()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;いずれの計算でも2.0と-1.0が得られた。したがって逆行列を利用した場合にも連立一次方程式(2)の解は同じになった。&lt;/p&gt;
&lt;h4&gt;逆行列を利用した連立一次方程式の解法&lt;/h4&gt;
&lt;p&gt;連立一次方程式を係数行列と列ベクトルとの積の形をした行列方程式\( A\vec{x} = \vec{b} \)に直してみると、逆行列には次のような関係があることが分かる。行列の右肩に乗っている指数-1がその行列の逆行列であることを示す目印。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
2 &amp;amp; -1 \\
1 &amp;amp; -1
\end{pmatrix}
\begin{pmatrix}
x \\
y
\end{pmatrix}
=
\begin{pmatrix}
5 \\
3
\end{pmatrix} \]
\[ \begin{pmatrix}
2 &amp;amp; -1 \\
1 &amp;amp; -1
\end{pmatrix}^{-1}
\begin{pmatrix}
5 \\
3
\end{pmatrix}
=
\begin{pmatrix}
x \\
y
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;行列演算における逆行列はスカラー演算における逆数と同じ役割を持っている。3の逆数は3分の1。3分の1は指数を用いて\( 3^{-1} \)とも書くことができる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ 3 \times 5 = 15 \]
\[ \dfrac{1}{3} \times 15 = 5 \]
\[ \dfrac{1}{3} = 3^{-1} \]&lt;/div&gt;
&lt;p&gt;掃き出し法（ガウスの消去法）を利用すると、ある行列からその逆行列を求めることもできる。その方法についてはまたの機会に。&lt;/p&gt;
&lt;p class=&quot;note&quot;&gt;係数行列が逆行列を持つ場合、したがってその行列式が0にならない場合、もとの連立一次方程式は必ず解を持つことが知られている。逆行列を持つ行列のことを正則行列と呼ぶので、係数行列が正則行列であるときにはガウスの消去法が適用できる。&lt;/p&gt;
&lt;p&gt;ちなみに、行列式を求めるには、RとGNU Octaveではdet()、Python3ではnumpyをimportしてlinalg.det()、Maximaではdeterminant()、Juliaではusing LinearAlgebraを実行してからdet()のそれぞれ()内に行列を渡す。 &lt;/p&gt;
&lt;h4&gt;例題2.&lt;/h4&gt;
&lt;p&gt;もう1つ、次の連立一次方程式を解いてみる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
-\dfrac{5}{7} - \dfrac{11}{7}x = -y \\
2y = 7 + 5x
\end{cases} \]&lt;/div&gt;
&lt;p&gt;この連立一次方程式は変数項と定数項が上下に揃っていないので、それらを整頓して標準形にすることから始める必要がある。標準形というのは例えば次のような連立一次方程式の形のこと。aからdが係数、xとyが変数（未知数）、mとnが定数。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
ax + by = m \\
cx + dy = n
\end{cases} \]&lt;/div&gt;
&lt;p&gt;左辺の変数xの項と変数yの項と右辺の定数項がそれぞれ列方向に揃っていることが見て取れる。この形が連立一次方程式の標準形。&lt;/p&gt;
&lt;p&gt;連立一次方程式の項に分数がある場合には計算をしやすくするために分数の分母を取り払っておくと便利。分母と同じ数をその分数に掛けるか、同じ方程式に複数の分数があればその最小公倍数を掛ける。&lt;/p&gt;
&lt;p&gt;方程式には等号を挟んだ両辺に同じ数による同じ演算を常に施して両辺の均衡を保つ必要があることを忘れずに。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;分数を持つ一次方程式を7倍して分母の7を取り払っておく。
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
-\dfrac{5}{7} - \dfrac{11}{7}x = -y \\
2y = 7 + 5x
\end{cases} \]
\[ \downarrow \]
\[ \begin{cases}
7 \cdot -\dfrac{5}{7} - 7 \cdot \dfrac{11}{7}x = 7 \cdot -y \\
2y = 7 + 5x
\end{cases} \]
\[ = \begin{cases}
-5 - 11x = -7y \\
2y = 7 + 5x
\end{cases} \]&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;移項によって各項の配置換えをして式を変形し、連立一次方程式を標準形を作る。移項とは方程式の特定の項を消すために両辺に同じ数の同じ演算を行い、その結果としてその項が等号の右辺と左辺の間を符号の反転を伴って移動したように見える操作。
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
\colorbox{yellow}{\(-5\)} - 11x = \colorbox{cyan}{\(-7y\)} \\
2y = 7 + \colorbox{pink}{\(5x\)}
\end{cases} \]
\[ \downarrow \]
\[ \begin{cases}
-5 + 5 - 11x + 7y = -7y + 7y + 5 \\
-5x + 2y = 7 + 5x - 5x
\end{cases} \]
\[ = \begin{cases}
-11x + \colorbox{cyan}{\(7y\)} = \colorbox{yellow}{\(5\)} \\
\colorbox{pink}{\(-5x\)} + 2y = 7
\end{cases} \]&lt;/div&gt;
上段の方程式の左辺にある-5に5を足して-5を消し、方程式の均衡を保つためにその右辺にも5を足した。上段の方程式の右辺にある-7yに7yを足して-7yを消し、方程式の均衡を保つためにその左辺にも7yを足した。さらに、下段の方程式の右辺の5xを消すために5xを引き、方程式の均衡を保つためにその左辺に-5xを加えた。これで連立一次方程式の標準形が完成した。&lt;/li&gt;
&lt;li&gt;標準形から拡大係数行列を作成する。
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
-11x + 7y = 5 \\
-5x + 2y = 7
\end{cases}
\leftrightarrow
\left( \begin{array}{cc|c}
-11 &amp;amp; 7 &amp;amp; 5 \\
-5 &amp;amp; 2 &amp;amp; 7
\end{array} \right) \]&lt;/div&gt;
0でない行頭（ピボット）の絶対値が最大のものが第1行目にあることが望ましいのでそうなっていない場合は行交換をする必要があったが、この場合はその必要がない。&lt;/li&gt;
&lt;li&gt;行基本変形3を適用し、第1行を-1倍して第2行に足してみる。\( R_1, R_2, \cdots \)は行列の各行を指している。例えば\( R_2 \)は第2行。
&lt;div class=&quot;math&quot;&gt;\[ \left( \begin{array}{cc|c}
-11 &amp;amp; 7 &amp;amp; 5 \\
-5 &amp;amp; 2 &amp;amp; 7
\end{array} \right) \]
\[ \downarrow \]
\[ -R_1 + R_2 \rightarrow R_2 \]
\[ \left( \begin{array}{cc|c}
-11 &amp;amp; 7 &amp;amp; 5 \\
-1 \cdot -11 + (-5) &amp;amp; -1 \cdot 7 + 2 &amp;amp; -1 \cdot 5 + 7
\end{array} \right) \]
\[ = \left( \begin{array}{cc|c}
-11 &amp;amp; 7 &amp;amp; 5 \\
6 &amp;amp; -5 &amp;amp; 2
\end{array} \right) \]
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;行基本変形3を適用し、第2行を2倍して第1行に足してみる。
&lt;div class=&quot;math&quot;&gt;\[ \left( \begin{array}{cc|c}
-11 &amp;amp; 7 &amp;amp; 5 \\
6 &amp;amp; -5 &amp;amp; 2
\end{array} \right) \]
\[ \downarrow \]
\[ 2R_2 + R_1 \rightarrow R_1 \]
\[ \left( \begin{array}{cc|c}
2 \cdot 6 + (-11) &amp;amp; 2 \cdot -5 + 7 &amp;amp; 2 \cdot 2 + 5 \\
6 &amp;amp; -5 &amp;amp; 2
\end{array} \right) \]
\[ = \left( \begin{array}{cc|c}
1 &amp;amp; -3 &amp;amp; 9 \\
6 &amp;amp; -5 &amp;amp; 2
\end{array} \right) \]&lt;/div&gt;
ピボットを1にすることができた。&lt;/li&gt;
&lt;li&gt;行基本変形3を適用し、第1行を-6倍して第2行に足してみる。
&lt;div class=&quot;math&quot;&gt;\[ \left( \begin{array}{cc|c}
1 &amp;amp; -3 &amp;amp; 9 \\
6 &amp;amp; -5 &amp;amp; 2
\end{array} \right) \]
\[ \downarrow \]
\[ -6R_1 + R_2 \rightarrow R_2 \]
\[ \left( \begin{array}{cc|c}
1 &amp;amp; -3 &amp;amp; 9 \\
-6 \cdot 1 + 6 &amp;amp; -6 \cdot -3 + (-5) &amp;amp; -6 \cdot 9 + 2 \\
\end{array} \right) \]
\[ = \left( \begin{array}{cc|c}
1 &amp;amp; -3 &amp;amp; 9 \\
0 &amp;amp; 13 &amp;amp; -52
\end{array} \right) \]&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;行基本変形2を適用し、第2行を13分の1倍する。つまり13で割ってみる。
&lt;div class=&quot;math&quot;&gt;\[ \left( \begin{array}{cc|c}
1 &amp;amp; -3 &amp;amp; 9 \\
0 &amp;amp; 13 &amp;amp; -52
\end{array} \right) \]
\[ \downarrow \]
\[ \dfrac{1}{13}R_2 \rightarrow R_2 \]
\[ \left( \begin{array}{cc|c}
1 &amp;amp; -3 &amp;amp; 9 \\
\dfrac{1}{13} \cdot 0 &amp;amp; \dfrac{1}{13} \cdot 13 &amp;amp; \dfrac{1}{13} \cdot -52
\end{array} \right) \]
\[ = \left( \begin{array}{cc|c}
1 &amp;amp; -3 &amp;amp; 9 \\
0 &amp;amp; 1 &amp;amp; -4
\end{array} \right) \]&lt;/div&gt;
これで拡大係数行列の左辺の係数行列の部分が行階段形になった。ここまでの処理は狭義でのガウスの消去法。ここまでの処理はガウスの消去法において前進消去と呼ばれている。ここから先はガウス＝ジョーダンの消去法。&lt;/li&gt;
&lt;li&gt;第1行第2列の-3を消すために行基本変形3を適用し、第2行を3倍して第1行に足してみる。
&lt;div class=&quot;math&quot;&gt;\[ \left( \begin{array}{cc|c}
1 &amp;amp; -3 &amp;amp; 9 \\
0 &amp;amp; 1 &amp;amp; -4
\end{array} \right) \]
\[ \downarrow \]
\[ 3R_2 + R_1 \rightarrow R_1 \]
\[ \left( \begin{array}{cc|c}
3 \cdot 0 + 1 &amp;amp; 3 \cdot 1 + (-3) &amp;amp; 3 \cdot -4 + 9 \\
0 &amp;amp; 1 &amp;amp; -4
\end{array} \right) \]
\[ = \left( \begin{array}{cc|c}
1 &amp;amp; 0 &amp;amp; -3 \\
0 &amp;amp; 1 &amp;amp; -4
\end{array} \right) \]&lt;/div&gt;
これで拡大係数行列が行簡約階段形、したがって係数行列の部分が単位行列の形になった。ここでガウス＝ジョーダンの消去法が完了。&lt;/li&gt;
&lt;li&gt;あとは拡大係数行列を連立一次方程式の形に戻せば、
&lt;div class=&quot;math&quot;&gt;\[ \left( \begin{array}{cc|c}
1 &amp;amp; 0 &amp;amp; -3 \\
0 &amp;amp; 1 &amp;amp; -4
\end{array} \right)
\leftrightarrow
\begin{cases}
x = -3 \\
y = -4
\end{cases} \]&lt;/div&gt;
と求まったことが分かる。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ガウスの消去法では、行階段形になったところで行基本変形を中断し、連立一次方程式の形に戻し、代入法によってその解を求めることもできる。この代入は後退代入と呼ばれている。それは次のようにする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \left( \begin{array}{cc|c}
1 &amp;amp; -3 &amp;amp; 9 \\
0 &amp;amp; 1 &amp;amp; -4
\end{array} \right)
\leftrightarrow
\begin{cases}
x - 3y = 9 \\
y = \colorbox{yellow}{-4}
\end{cases} \]
\[ \downarrow \]
\begin{align*}
x - 3 \cdot \colorbox{yellow}{-4} &amp;amp;= 9 \\
x &amp;amp;= \dfrac{9 + 3}{-4} \\
x &amp;amp;= -\dfrac{12}{4} \\
x &amp;amp;= -3
\end{align*}&lt;/div&gt;
&lt;p&gt;これは移項ではないので符号は変わらない。&lt;/p&gt;
&lt;p&gt;そんなわけで狭義でのガウスの消去法には前進消去と後退代入との2段階がある。&lt;/p&gt;
&lt;p&gt;Maximaで答え合わせをしてみる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;(%i1) eqn1: -(5/7) - (11/7)*x = -y;
                                 11 x    5
(%o1)                         (- ----) - - = - y
                                  7      7
(%i2) eqn2: 2*y = 7 + 5*x;
(%o2)                            2 y = 5 x + 7
(%i3) solve([eqn1,eqn2],[x,y]);
(%o3)                        [[x = - 3, y = - 4]]
(%i4) quit();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Maximaで計算してもxが-3でyが-4になった。&lt;/p&gt;
&lt;h4&gt;行階段形と行簡約階段形とピボット&lt;/h4&gt;
&lt;p&gt;ここでは、ガウスの消去法で重要な役割を果たす行階段形という概念と、ガウス＝ジョーダンの消去法で重要な役割を果たす行簡約階段形という概念について直感的に記す。&lt;/p&gt;
&lt;p&gt;典型的な行階段形は次のような形をした行列。ただし\( a_1, a_2, \cdots \)は0以外の成分。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
1 &amp;amp; a_1 &amp;amp; a_2 &amp;amp; a_3 &amp;amp; a_4 &amp;amp; a_5 \\
0 &amp;amp; 1 &amp;amp; a_6 &amp;amp; a_7 &amp;amp; a_8 &amp;amp; a_9 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_{10} &amp;amp; a_{11} &amp;amp; a_{12} \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_{13} &amp;amp; a_{14} \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_{15}
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;次のような行列も行階段形。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
1 &amp;amp; a_1 &amp;amp; a_2 &amp;amp; a_3 &amp;amp; a_4 &amp;amp; a_5 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_5 &amp;amp; a_6 &amp;amp; a_8 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1  &amp;amp; a_7 &amp;amp; a_{10} \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_{11}\\
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;1が対角線上に綺麗に並んでいなくても行階段形が成り立つ。&lt;/p&gt;
&lt;p&gt;次のような行列も行階段形。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
0 &amp;amp; 1 &amp;amp; a_1 &amp;amp; a_2 &amp;amp; a_3 &amp;amp; a_4 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_5 &amp;amp; a_6 &amp;amp; a_8 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1  &amp;amp; a_7 &amp;amp; a_{10} \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_{11}\\
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;次のような行列は行階段形でない。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
1 &amp;amp; a_1 &amp;amp; a_2 &amp;amp; a_3 &amp;amp; a_4 &amp;amp; a_5 \\
0 &amp;amp; 1 &amp;amp; a_6 &amp;amp; a_7 &amp;amp; a_8 &amp;amp; a_9 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; \colorbox{pink}{\(a_{10}\)}  &amp;amp; a_{11} &amp;amp; a_{12} \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_{13}\\
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;各行の先頭が1でない行列は行階段形であるとは言えない。&lt;/p&gt;
&lt;p&gt;次のような行列も行階段形ではない。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
1 &amp;amp; a_1 &amp;amp; a_2 &amp;amp; a_3 &amp;amp; a_4 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_5 &amp;amp; a_6 \\
0 &amp;amp; 0 &amp;amp; \colorbox{pink}{1} &amp;amp; a_7  &amp;amp; a_8 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_9 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; \colorbox{pink}{1} &amp;amp; a_{10}
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;行の先頭の1はその上の行の先頭の1よりも常に右の列に位置していなければ行階段形の条件を満たさない。&lt;/p&gt;
&lt;p&gt;ちなみに、行頭が1でない場合、同様の形をした行列は上三角行列と呼ばれている。&lt;/p&gt;
&lt;p&gt;行簡約階段形は次のような形をした行列。つまり、行階段形の右上の成分が更に0へと削減され、行頭の1がある列がその1以外すべて0になった形。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; a_1 \\
0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; a_2 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 &amp;amp; a_3 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; a_4 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_5
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;次のような行列も行簡約階段形。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
1 &amp;amp; 0 &amp;amp; a_1 &amp;amp; 0 &amp;amp; 0 &amp;amp; a_2 \\
0 &amp;amp; 1 &amp;amp; a_3 &amp;amp; 0 &amp;amp; 0 &amp;amp; a_4 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; a_5 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_6 \\
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;各行の先頭の成分が1であり、第2行以下の先頭の1はその上の行の先頭の1よりもすべて右側の列にあり、先頭の1がある列はその1以外すべて0なので、行簡約階段形の条件を満たしている。&lt;/p&gt;
&lt;p&gt;次のような行列は行簡約階段形ではない。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
1 &amp;amp; 0 &amp;amp; a_1 &amp;amp; 0 &amp;amp; 0 &amp;amp; a_2 \\
0 &amp;amp; 1 &amp;amp; a_3 &amp;amp; 0 &amp;amp; 0 &amp;amp; a_4 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; \colorbox{pink}{\(a_5\)} &amp;amp; a_6 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_7 \\
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;第4行の先頭の1と同じ列に0以外の成分が含まれているので行簡約階段形の条件を満たすことができない。&lt;/p&gt;
&lt;p&gt;0を除外して見たとき、各行の先頭の成分はピボットとも呼ばれている。ガウスの消去法においてピボットをいかに選択するかが演算の効率を決める。コンピュータで連立一次方程式の数値計算を行う場合、ピボットを適切に選択することが丸め誤差の問題を回避するために特に重要になる。&lt;/p&gt;
&lt;div class=&quot;fieldset&quot;&gt;
&lt;h3 class=&quot;legend&quot;&gt;まとめ&lt;/h3&gt;
&lt;dl&gt;
&lt;dt&gt;ガウスの消去法&lt;/dt&gt;
&lt;dd&gt;英語ではGaussian Elimination。連立一次方程式（線形方程式系とも呼ばれている）を行列を用いて解く方法。&lt;/dd&gt;
&lt;dd&gt;連立一次方程式の左辺の共通する変数項と右辺の定数項を揃え、その係数と定数をその順番のとおりに行列として並べて連立一次方程式の標準形を作り、そこから係数と定数を取り出し、標準形の並び順の通りに並べて拡大係数行列を作る。そしてその拡大係数行列が行階段形になるように3種類の行基本変形を選んで行う。&lt;/dd&gt;
&lt;dd&gt;ガウス＝ジョーダンの消去法と区別して称した場合のガウス消去法は、拡大係数行列が行階段形になるまで行基本変形を繰り返すものを指し、これを前進消去と呼ぶことがある。行階段形になった時点で拡大係数行列を連立一次方程式に戻し、そこから後退代入による計算を行ってその連立一次方程式の解を最終的に得る。&lt;/dd&gt;
&lt;dd&gt;計算機科学の数値計算プログラミングにおいてよく例示されているアルゴリズムはこれ。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;ガウス＝ジョーダンの消去法（ガウス＝ジョルダンの消去法）&lt;/dt&gt;
&lt;dd&gt;英語ではGaussian-Jordan Elimination。日本語では掃き出し法とも呼ばれている。連立一次方程式（線形方程式系とも呼ばれている）を行列を用いて解く方法。掃き出し法やガウスの消去法と言えば数学では通常こちらを指すことが多い。&lt;/dd&gt;
&lt;dd&gt;ガウスの消去法では拡大係数行列が行階段形になるまで行基本変形を繰り返すのに対し、ガウス＝ジョーダンの消去法では拡大係数行列が行簡約階段形（行既約階段形とも呼ばれている）になるまで行基本変形を繰り返す。&lt;/dd&gt;
&lt;dd&gt;ガウス＝ジョーダンの消去法を選ぶかガウスの消去法を選ぶかは場合によりけり。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;係数行列&lt;/dt&gt;
&lt;dd&gt;英語ではCoefficient Matrices。連立一次方程式を標準形に変形し、その左辺にある係数すべてを同じ変数同士で列を構成するように並べて行列にしたもの。\( a_{11}, \cdots, a_{mn} \)は係数、\( x_1, \cdots, x_n \)は未知の変数（未知数）、\( b_1, \cdots, b_n \)は定数。
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
a_{11}x_1 + a_{12}x_2 + a_{13}x_3 + \cdots + a_{1n}x_n = b_1 \\
a_{21}x_1 + a_{22}x_2 + a_{23}x_3 + \cdots + a_{2n}x_n = b_2 \\
a_{31}x_1 + a_{32}x_2 + a_{33}x_3 + \cdots + a_{3n}x_n = b_3 \\
\hspace{9em} \vdots \\
a_{m1}x_1 + a_{m2}x_2 + a_{m3}x_3 + \cdots + a_{mn}x_n = b_n
\end{cases} \]
\[ \updownarrow \]
\[ \begin{pmatrix}
a_{11} &amp;amp; a_{12} &amp;amp; a_{13} &amp;amp; \cdots &amp;amp; a_{1n} \\
a_{21} &amp;amp; a_{22} &amp;amp; a_{23} &amp;amp; \cdots &amp;amp; a_{2n} \\
a_{31} &amp;amp; a_{32} &amp;amp; a_{33} &amp;amp; \cdots &amp;amp; a_{3n} \\
\vdots &amp;amp; \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots \\
a_{m1} &amp;amp; a_{m2} &amp;amp; a_{m3} &amp;amp; \cdots &amp;amp; a_{mn}
\end{pmatrix} \]&lt;/div&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;拡大係数行列&lt;/dt&gt;
&lt;dd&gt;英語ではAugmented Matrices。単に拡大行列とも呼ばれている。連立一次方程式の標準形の右辺にある定数項の列を係数行列の右側に追加した行列のこと。\( a_{11}, \cdots, a_{mn} \)は係数、\( x_1, \cdots, x_n \)は未知の変数（未知数）、\( b_1, \cdots, b_n \)は定数。
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
a_{11}x_1 + a_{12}x_2 + a_{13}x_3 + \cdots + a_{1n}x_n = b_1 \\
a_{21}x_1 + a_{22}x_2 + a_{23}x_3 + \cdots + a_{2n}x_n = b_2 \\
a_{31}x_1 + a_{32}x_2 + a_{33}x_3 + \cdots + a_{3n}x_n = b_3 \\
\hspace{9em} \vdots \\
a_{m1}x_1 + a_{m2}x_2 + a_{m3}x_3 + \cdots + a_{mn}x_n = b_n
\end{cases} \]
\[ \updownarrow \]
\[ \left( \begin{array}{ccccc|c}
a_{11} &amp;amp; a_{12} &amp;amp; a_{13} &amp;amp; \cdots &amp;amp; a_{1n} &amp;amp; b_1 \\
a_{21} &amp;amp; a_{22} &amp;amp; a_{23} &amp;amp; \cdots &amp;amp; a_{2n} &amp;amp; b_2 \\
a_{31} &amp;amp; a_{32} &amp;amp; a_{33} &amp;amp; \cdots &amp;amp; a_{3n} &amp;amp; b_3 \\
\vdots &amp;amp; \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots &amp;amp; \vdots \\
a_{m1} &amp;amp; a_{m2} &amp;amp; a_{m3} &amp;amp; \cdots &amp;amp; a_{mn} &amp;amp; b_n
\end{array} \right) \]&lt;/div&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;行基本変形&lt;/dt&gt;
&lt;dd&gt;英語ではElementary Row Operations。拡大係数行列を構成する行に対し、3種類の操作を用いて行列の成分を0に、もしくは行列の成分の係数を1にもってゆく方法。3種類の操作とは、
&lt;ol&gt;
&lt;li&gt;ある2つの行同士の位置を置き換えること（\( R_1 \leftrightarrows R_2 \)）、&lt;/li&gt;
&lt;li&gt;ある行の各成分を共通の値で定数倍すること（\( rR_i \)）、&lt;/li&gt;
&lt;li&gt;ある行の各成分を共通の値で定数倍した各値をもう1つの行の同の一列の各成分に加算すること（\( rR_1 + R_2 \rightarrow R_2 \)）&lt;/li&gt;
&lt;/ol&gt;
を指している。\( R_1, R_2, \cdots, R_i \)は各行または任意の行、rはなんらかの実数。行基本変形では同一行の全ての成分に同じ演算を行う必要がある。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;単位行列&lt;/dt&gt;
&lt;dd&gt;英語ではIdentity Matrices。正方行列であり、かつ、対角行列であり、かつ、対角線上の成分が1のみで構成された行列のこと。行列の演算においてスカラーの1と同様の働きを持つ。&lt;/dd&gt;
&lt;dd&gt;例えば次の行列は4列4行の、つまり4次の単位行列。
&lt;div class=&quot;math&quot;&gt;\[ I_4 = \begin{pmatrix}
1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\
0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \\
\end{pmatrix} \]&lt;/div&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;行列の行階段形&lt;/dt&gt;
&lt;dd&gt;英語ではRow Echelon Formと呼ばれており、頭文字を使ってREFと略されることが多い。次のような行列のこと。ただし\( a_1, a_2, a_3, \cdots \)は0でない成分。
&lt;div class=&quot;math&quot;&gt;\[ REF = \begin{pmatrix}
1 &amp;amp; a_1 &amp;amp; a_2 &amp;amp; a_3 &amp;amp; a_4 \\
0 &amp;amp; 1 &amp;amp; a_5 &amp;amp; a_6 &amp;amp; a_7 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_8 &amp;amp; a_9 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_{10} \\
\end{pmatrix} \]
\[ REF = \begin{pmatrix}
0 &amp;amp; 1 &amp;amp; a_1 &amp;amp; a_2 &amp;amp; a_3 &amp;amp; a_4 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_5 &amp;amp; a_6 &amp;amp; a_7 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_8 \\
\end{pmatrix} \]&lt;/div&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;行簡約階段形&lt;/dt&gt;
&lt;dd&gt;英語ではReduced Row Echelon Form。頭字語ではRREF。行列の行簡約階段形は行列の行階段形であり、かつ、行頭の1がある列がその1以外全て0になっているもの。典型的には次のような形をしている。\( a_1, \cdots, a_4 \)は0でない成分。
&lt;div class=&quot;math&quot;&gt;\[ RREF = \begin{pmatrix}
1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; a_1 \\
0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 &amp;amp; a_2 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; a_3 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; a_4 \\
\end{pmatrix} \]&lt;/div&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;連立n元一次方程式の標準形&lt;/dt&gt;
&lt;dd&gt;連立一次方程式を拡大係数行列に転記するためには連立一次方程式が標準形になっている必要がある。そうなっていなければ移項を使って標準形になるように式を変形することができる。&lt;/dd&gt;
&lt;dd&gt;連立n元一次方程式の標準形を一般形として記すと次のようになる。ただし\( a_{11}, \cdots, a_{mn} \)は係数、\( x_1, \cdots, x_n \)は未知の変数（未知数）、\( b_1, \cdots, b_n \)は定数。
&lt;div class=&quot;math&quot;&gt;\[ \begin{cases}
a_{11}x_1 + a_{12}x_2 + a_{13}x_3 + \cdots + a_{1n}x_n = b_1 \\
a_{21}x_1 + a_{22}x_2 + a_{23}x_3 + \cdots + a_{2n}x_n = b_2 \\
a_{31}x_1 + a_{32}x_2 + a_{33}x_3 + \cdots + a_{3n}x_n = b_3 \\
\hspace{9em} \vdots \\
a_{m1}x_1 + a_{m2}x_2 + a_{m3}x_3 + \cdots + a_{mn}x_n = b_n 
\end{cases} \]&lt;/div&gt;
&lt;/dd&gt;
&lt;dd&gt;これを行列方程式\( A\vec{x} = \vec{b} \)として一般的に表すと次のようになる。
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
a_{11} &amp;amp; a_{12} &amp;amp; a_{13} &amp;amp; \cdots &amp;amp; a_{1n} \\
a_{21} &amp;amp; a_{22} &amp;amp; a_{23} &amp;amp; \cdots &amp;amp; a_{2n} \\
a_{31} &amp;amp; a_{32} &amp;amp; a_{33} &amp;amp; \cdots &amp;amp; a_{3n} \\
\vdots &amp;amp; \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots \\
a_{m1} &amp;amp; a_{m2} &amp;amp; a_{m3} &amp;amp; \cdots &amp;amp; a_{mn}
\end{pmatrix}
\begin{pmatrix}
x_1 \\
x_2 \\
x_3 \\
\vdots \\
x_n
\end{pmatrix}
=
\begin{pmatrix}
b_1 \\
b_2 \\
b_3 \\
\vdots \\
b_n
\end{pmatrix}
\]&lt;/div&gt;
&lt;/dd&gt;
&lt;dd&gt;これをベクトル方程式として一般的に表すと次のようになる。
&lt;div class=&quot;math&quot;&gt;\[ x_1 \begin{pmatrix}
a_{11} \\
a_{21} \\
a_{31} \\
\vdots \\
a_{m1}
\end{pmatrix}
x_2 \begin{pmatrix}
a_{12} \\
a_{22} \\
a_{32} \\
\vdots \\
a_{m2}
\end{pmatrix}
x_3 \begin{pmatrix}
a_{13} \\
a_{23} \\
a_{33} \\
\vdots \\
a_{m3}
\end{pmatrix}
\cdots
x_n \begin{pmatrix}
a_{1n} \\
a_{2n} \\
a_{3n} \\
\vdots \\
a_{mn}
\end{pmatrix}
= \begin{pmatrix}
b_1 \\
b_2 \\
b_3 \\
\vdots \\
b_n
\end{pmatrix} \]&lt;/div&gt;
各列ベクトルが各未知数（各変数）によって重み付けされている関係がこの式から見て取れる。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;R言語で連立一次方程式を解くには&lt;/dt&gt;
&lt;dd&gt;matrix()とc()で係数行列と定数項の列ベクトルを用意し、solve()の引数として渡す。あるいはまた、pracmaというパッケージを利用してMATLAB互換のrref()を用いることができる。その際にlibrary(pracma)を実行しておく必要がある。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;Python3で連立一次方程式を解くには&lt;/dt&gt;
&lt;dd&gt;Numpyをimportし、numpy.matrix()で係数行列と定数項の列ベクトルを作成した後、それらをnumpy.linalg.solve()の引数として渡す。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;GNU Octaveで連立一次方程式を解くには&lt;/dt&gt;
&lt;dd&gt;係数行列と定数項の列ベクトルを作成した後、linsolve()の引数としてそれらを渡す。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;Maximaで連立一次方程式を解くには&lt;/dt&gt;
&lt;dd&gt;連立一次方程式を構成する各々の一次方程式をeqn1,eqn2,eqn3とし、各々の未知の変数をx,y,zとした場合、solve([eqn1,eqn2,eqn3],[x,y,z])とすることによってその解を求めることができる。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;Juliaで連立一次方程式を解くには&lt;/dt&gt;
&lt;dd&gt;係数行列と定数項の列ベクトルを作成した後、演算子の\を用いるか、inv()で係数行列の逆行列を作って列ベクトルとの内積を求める。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;逆行列&lt;/dt&gt;
&lt;dd&gt;英語ではMatrix InversesとかInverse Matricesなどと呼ばれることがある。ある行列の余因子行列と行列式を導き出し、それら余因子行列と行列式分の1との定数倍を求めると逆行列が出来上がる。通常のスカラー代数で言うところの逆数に当たる。逆行列は右肩に-1を添えて表されることが多い。&lt;/dd&gt;
&lt;dd&gt;\( a_{11}, \cdots, a_{22} \)は任意の成分。
&lt;div class=&quot;math&quot;&gt;\begin{align*}
\begin{pmatrix}
a_{11} &amp;amp; a_{12} \\
a_{21} &amp;amp; a_{22}
\end{pmatrix}^{-1}
&amp;amp;= \dfrac{1}{a_{11}a_{22} - a_{12}a_{21}}
\begin{pmatrix}
a_{22} &amp;amp; -a_{12} \\
-a_{21} &amp;amp; a_{11}
\end{pmatrix}
\end{align*}&lt;/div&gt;
&lt;/dd&gt;
&lt;dd&gt;detはその行列の行列式を表す目印。
&lt;div class=&quot;math&quot;&gt;
\[ a_{11}a_{22} - a_{12}a_{21}
= det \begin{pmatrix}
a_{11} &amp;amp; a_{12} \\
a_{21} &amp;amp; a_{22}
\end{pmatrix}\]&lt;/div&gt;
&lt;/dd&gt;
&lt;dd&gt;ちなみに、逆行列を持つ行列は正則行列と呼ばれている。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;連立一次方程式が解を持つための必要十分条件は&lt;/dt&gt;
&lt;dd&gt;その係数行列が正則行列であるとき。正則行列とは行列式が0でない行列のこと。行列式が0でない行列はその逆行列を持っている。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;移項&lt;/dt&gt;
&lt;dd&gt;方程式を解くための方法の1つ。方程式において等号を境とした一方の辺からもう一方の辺へとある項を移動させるとき、その項の正負の符号を反転させなくてはならない操作。項が等号を跳び越えるときにその項に-1を掛けなければいけない操作であると言い換えることもできる。
&lt;div class=&quot;math&quot;&gt;\[ a = -b \]
\[ \updownarrow \]
\[ b = -a \]&lt;/div&gt;
左辺のaが右辺に移ると-aになり、左辺の-bが右辺に移るとbになる。右辺から左辺に移る場合も同様に正負が反転する。&lt;/dd&gt;
&lt;dd&gt;英語ではTranspositionとかTransposingと呼ばれていることがあるが、こちらの用語はもっと広い意味を持っているかもしれない。方程式の式変形に限ってみても係数を消す操作がTranspositionに含まれているかもしれない。この場合には逆演算の関係にある乗法と除法が反転する。
&lt;div class=&quot;math&quot;&gt;\begin{align*}
ax &amp;amp;= b \\
x &amp;amp;= b \cdot \dfrac{1}{a} = \dfrac{b}{a}
\end{align*}&lt;/div&gt;
つまり、この方程式の左辺のaが等号を跳び越えて右辺の末尾に移動すると、逆数のa分の1を掛ける形に変わる。&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;h4&gt;関連投稿&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2018/08/blog-post.html&quot;&gt;数学の行列とその情報処理の初歩ノート&lt;/a&gt;&lt;/dt&gt;
&lt;dt&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2018/08/r.html&quot;&gt;行列の加法・減法・実数倍・乗法 + R言語&lt;/a&gt;&lt;/dt&gt;
&lt;dt&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2021/07/blog-post_18.html&quot;&gt;行列式、ラプラス展開、逆行列、行列の割り算&lt;/a&gt;&lt;/dt&gt;
&lt;/dl&gt;
&lt;script&gt;
(function() {

   // 直交座標系を描く函数
   function coordinateSystem(canvasID,x,y) {
      const canvas = document.getElementById(canvasID);
      const context = canvas.getContext(&quot;2d&quot;);

      // x軸
      
      context.beginPath(); //パスのリセット
      context.lineWidth = 1; //線幅

      let mx = x;
      let my = 0;
      let lx = x;
      let ly = 200;
      context.moveTo(mx, my); //線の始点
      context.lineTo(lx, ly); //線の終点
      context.stroke(); //描画

      // y軸

      context.lineWidth =  1;
      context.beginPath();

      mx = 0;
      my = y;
      lx = 200;
      ly = y;
      context.moveTo(mx, my);
      context.lineTo(lx, ly);
      context.stroke();
   }


// 一次方程式A
function linearEquationA(canvasID,xx,xy,yx,yy){
   const canvas = document.getElementById(canvasID);
   const context = canvas.getContext(&quot;2d&quot;);

   context.lineWidth = 1;
   context.strokeStyle = &#39;blue&#39;; //線色
   context.beginPath();

   let mx = xx;
   let my = xy;
   let lx = yx;
   let ly = yy;
   context.moveTo(mx, my);
   context.lineTo(lx, ly);
   context.stroke();
}

// 一次方程式B
function linearEquationB(canvasID,xx,xy,yx,yy){
   const canvas = document.getElementById(canvasID);
   const context = canvas.getContext(&quot;2d&quot;);

   context.lineWidth = 1;
   context.strokeStyle = &#39;red&#39;; //線色
   context.beginPath();

   let mx = xx;
   let my = xy;
   let lx = yx;
   let ly = yy;
   context.moveTo(mx, my);
   context.lineTo(lx, ly);
   context.stroke();
}

// canvasのID
const canvasID1 = &quot;chartOfEquation20211210&quot;;
const canvasID2 = &quot;chartOfSystemOfEquations20211210a&quot;;
const canvasID3 = &quot;chartOfSystemOfEquations20211210b&quot;;
const canvasID4 = &quot;chartOfSystemOfEquations20211210c&quot;;

// 函数の呼び出し
coordinateSystem(canvasID1, 100, 100);
linearEquationA(canvasID1,0,200,200,50)

coordinateSystem(canvasID2, 100, 100);
linearEquationA(canvasID2,200,200,0,50)
linearEquationB(canvasID2,150,200,0,10)

coordinateSystem(canvasID3, 100, 100);
linearEquationA(canvasID3,50,200,150,0)
linearEquationB(canvasID3,15,200,115,0)

coordinateSystem(canvasID4, 100, 100);
linearEquationA(canvasID4,0,120,200,50)
linearEquationB(canvasID4,0,120,200,50)

})();
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/8547731065509777974/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2021/12/blog-post_11.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/8547731065509777974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/8547731065509777974'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2021/12/blog-post_11.html' title='ガウスの消去法（掃き出し法） 行基本変形 行簡約階段形'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-2332094142668076782</id><published>2021-10-05T22:34:00.002+09:00</published><updated>2025-09-05T11:53:18.929+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="NLTK"/><category scheme="http://www.blogger.com/atom/ns#" term="自然言語処理"/><title type='text'>DebianユーザーがNLTKで自然言語処理の初歩の初歩を試してみた</title><content type='html'>&lt;p&gt;この投稿は自然言語処理の中で一番初歩的なテキスト分析（字句解析）についての事始め。&lt;/p&gt;
&lt;h4&gt;ダウンロードとインストール&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt; 3のdebパッケージとPython3用の&lt;a href=&quot;https://www.nltk.org/&quot;&gt;NLTK(Natural Language Toolkit)&lt;/a&gt;のdebパッケージを公式のリポジトリからダウンロードしてインストールした。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ su
# apt install python3 python3-nltk&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;python3-nltkというdebパッケージは、Debianのバージョンのbusterにもbullseyeにもbookwormにも存在する。&lt;/p&gt;
&lt;p&gt;NLTKは、そのホームページの説明等によれば、自然言語処理に必要な道具類をまとめたプラットフォームなのだそうで、しかもオープンソースの企画らしい。&lt;/p&gt;
&lt;p&gt;ダウンロードとインストールがうまくいったのでPython3を早速起動し、&lt;a href=&quot;https://www.nltk.org/&quot;&gt;NLTKのホームページ&lt;/a&gt;に掲載されている簡単なコードを試してみた。&lt;/p&gt;
&lt;p&gt;まずはPython3をターミナル・エミュレーター上で起動。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ python3
Python 3.7.3 （省略）&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次にNLTKをインポート。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import nltk&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;適当に選んだ文字列をsentenceに代入した。sentenceは任意の識別子。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; sentence = &quot;&quot;&quot;A similar argument applies
...  to any other a priori judgement.&quot;&quot;&quot;
&amp;gt;&amp;gt;&amp;gt; print(sentence)
A similar argument applies
 to any other a priori judgement.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Python 3ではヒアドキュメントを3つの二重引用符号(&quot;&quot;&quot;)で囲む。こうした場合、/nなどによって改行を明示せずとも複数行に渡って文字列を入力できる。ヒアドキュメントとはHTMLのpre要素のようなもの。&lt;/p&gt;
&lt;p&gt;文字列として選んだのはバートランド・ラッセル著の『哲学の問題』からの一節。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.feedbooks.com/book/4198/the-problems-of-philosophy&quot;&gt;Russell, Bertrand. &lt;cite&gt;The Problems of Philosophy&lt;/cite&gt;.&lt;/a&gt; p.140
&lt;p&gt;epub形式のファイルはLinuxではCalibreなどで読むことができる。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そしてNLTKのword_tokenize()に引数としてその文字列を渡してトークンを抽出。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; tokens = nltk.word_tokenize(sentence)
Traceback (most recent call last):
（中略）
LookupError: 
**********************************************************************
  Resource punkt not found.
  Please use the NLTK Downloader to obtain the resource:

  &amp;gt;&amp;gt;&amp;gt; import nltk
  &amp;gt;&amp;gt;&amp;gt; nltk.download(&#39;punkt&#39;)
  
  Attempted to load tokenizers/punkt/PY3/english.pickle
（以下省略）&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ここでいきなりエラーが生じた。リソースのpunktが見つからないと言われた。エラーのメッセージにあるとおり、NLTKのdownload()によってpunktをダウンロードしたみた。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; nltk.download(&#39;punkt&#39;)
[nltk_data] Downloading package punkt to（中略）
[nltk_data]   Unzipping tokenizers/punkt.zip.
True&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;こうしたリソースは&lt;a href=&quot;https://www.nltk.org/nltk_data/&quot;&gt;NLTK Data&lt;/a&gt;と呼ばれていて&lt;code&gt;nltk.download()&lt;/code&gt;によってダウンロードすることができる。&lt;/p&gt;
&lt;p&gt;もう一度やり直し。キーボードの上矢印キーを押すと前に入力したコードを順番に出力してくれるので、その機能を利用すると便利。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; tokens = nltk.word_tokenize(sentence)
&amp;gt;&amp;gt;&amp;gt; print(tokens)
[&#39;A&#39;, &#39;similar&#39;, &#39;argument&#39;, &#39;applies&#39;, &#39;to&#39;, &#39;any&#39;, &#39;other&#39;, &#39;a&#39;, &#39;priori&#39;, &#39;judgement&#39;, &#39;.&#39;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;うまくいった。個々の単語や符号に分割してくれているのが見て取れる。この処理は&lt;dfn&gt;トークン化&lt;/dfn&gt;と呼ばれているらしい。英語では&lt;dfn&gt;tokenization&lt;/dfn&gt;。&lt;/p&gt;
&lt;p&gt;英文の場合はそのほとんどが分ち書きされるので、このメソッドの内部コードは簡単そうだ。日本語や中国語やタイ語だと複雑になりそう。&lt;/p&gt;
&lt;p&gt;トークン化で生成したtokensをNLTKのpos_tag()に渡して単語に品詞タグを付ける処理を行うコードが次。ただしこの処理にはaveraged_perceptron_taggerというリソースが必要になるので先ほどと同じようにダウンロードした。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; nltk.download(&#39;averaged_perceptron_tagger&#39;)
[nltk_data] Downloading package averaged_perceptron_tagger to（中略）
[nltk_data]   Unzipping taggers/averaged_perceptron_tagger.zip.
True
&amp;gt;&amp;gt;&amp;gt; tagged = nltk.pos_tag(tokens)
&amp;gt;&amp;gt;&amp;gt; print(tagged)
[(&#39;A&#39;, &#39;DT&#39;), (&#39;similar&#39;, &#39;JJ&#39;), (&#39;argument&#39;, &#39;NN&#39;), (&#39;applies&#39;, &#39;NNS&#39;), (&#39;to&#39;, &#39;TO&#39;), (&#39;any&#39;, &#39;DT&#39;), (&#39;other&#39;, &#39;JJ&#39;), (&#39;a&#39;, &#39;DT&#39;), (&#39;priori&#39;, &#39;JJ&#39;), (&#39;judgement&#39;, &#39;NN&#39;), (&#39;.&#39;, &#39;.&#39;)]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;この処理は&lt;dfn&gt;品詞タグ付け&lt;/dfn&gt;と呼ばれているらしい。英語では&lt;dfn&gt;part-of-speech tagging&lt;/dfn&gt;、略して&lt;dfn&gt;POS tagging&lt;/dfn&gt;。&lt;/p&gt;
&lt;p&gt;DTは決定詞、JJは形容詞、NNは名詞の単数形、NNSは名詞の複数形、TOはtoを直接指す。&lt;/p&gt;
&lt;p&gt;タグがどの品詞を意味しているかについて知りたい場合は「part-of-speech tagging tagset NLTK」などの文字列でインターネット上を検索してみれば見つかる。英文だけど。&lt;/p&gt;
&lt;p&gt;よく見ると、appliesを名詞の複数形(NNS)と判断している。これは誤りだと思う。appliesは動詞applyの三人称単数現在(VBZ)が正しいはず。&lt;/p&gt;
&lt;p&gt;次に行う処理は&lt;dfn&gt;チャンキング&lt;/dfn&gt;と呼ばれていること。英語では&lt;dfn&gt;chunking&lt;/dfn&gt;。「分割すること」というような意味。この処理にはmaxent_ne_chunker とwordsというリソースが必要になるので予めダウンロードする。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; nltk.download(&#39;maxent_ne_chunker&#39;)
[nltk_data] Downloading package maxent_ne_chunker to（中略）
[nltk_data]   Unzipping chunkers/maxent_ne_chunker.zip.
True
&amp;gt;&amp;gt;&amp;gt; nltk.download(&#39;words&#39;)
[nltk_data] Downloading package words to
（中略）
[nltk_data]   Unzipping corpora/words.zip.
True&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;品詞タグ付けで生成したtaggedを与えてNLTKのchunk.ne_chunk()を実行する。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; entities = nltk.chunk.ne_chunk(tagged)
&amp;gt;&amp;gt;&amp;gt; print(entities)
(S
  A/DT
  similar/JJ
  argument/NN
  applies/NNS
  to/TO
  any/DT
  other/JJ
  a/DT
  priori/JJ
  judgement/NN
  ./.)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;チャンキングの処理結果を見ると、ディレクトリ状にまとめられ、その先頭には&#39;S&#39;という文字があるのが見て取れる。前者を&lt;dfn&gt;セグメント化&lt;/dfn&gt;と呼び、後者を&lt;dfn&gt;ラベル付け&lt;/dfn&gt;と呼ぶらしい。&lt;/p&gt;
&lt;h4&gt;名詞句のルールを追加&lt;/h4&gt;
&lt;p&gt;名詞句(NP)を分類するために更に文法ルールを適用する。NPは名詞句を表すタグ名。波括弧内では正規表現を用いて名詞句の構造を定義している。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; grammar = &quot;NP: {&amp;lt;DT&amp;gt;?&amp;lt;JJ&amp;gt;*&amp;lt;NN&amp;gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;波括弧内の正規表現が意味するのは、DT（決定詞）かJJ（形容詞）で始まり、NN（名詞）で終わるもの。?がorを表し、*が任意の文字列を表している。&lt;/p&gt;
&lt;p&gt;これをRegexpParser()に引数として渡してチャンキングのルールを追加する。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; cp = nltk.RegexpParser(grammar)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;追加したこのルールに基づいて構文解析を行う。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; result = cp.parse(entities)
&amp;gt;&amp;gt;&amp;gt; print(result)
(S
  (NP A/DT similar/JJ argument/NN)
  applies/NNS
  to/TO
  any/DT
  other/JJ
  (NP a/DT priori/JJ judgement/NN)
  ./.)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;決定詞と形容詞と名詞から成る2つの名詞句が分類されているのが見て取れる。&lt;/p&gt;
&lt;p&gt;これを構文木として視覚化するにはdraw()を実行する。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; result.draw()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;別ウィンドウが開いてその中に構文木が表示された。&lt;/p&gt;
&lt;p&gt;正規表現は本当ならば&lt;code&gt;&quot;NP: {&amp;lt;DT&amp;gt;?&amp;lt;JJ&amp;gt;?&amp;lt;JJR&amp;gt;?&amp;lt;JJS&amp;gt;*&amp;lt;NN&amp;gt;?&amp;lt;NNS&amp;gt;?&amp;lt;NNP&amp;gt;?&amp;lt;NNPS&amp;gt;}&quot;&lt;/code&gt;としたかったが、appliesを名詞の複数形と認識してしまっているので誤った結果になってしまう。この修正ができるかどうかについてはまたの機会に。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/2332094142668076782/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2021/10/debiannltk.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/2332094142668076782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/2332094142668076782'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2021/10/debiannltk.html' title='DebianユーザーがNLTKで自然言語処理の初歩の初歩を試してみた'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-8912341564155553392</id><published>2021-09-21T12:13:00.014+09:00</published><updated>2025-09-04T09:58:28.203+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google Charts"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><title type='text'>Google Chartsを利用してHPやブログにチャート（グラフ等）を描く方法</title><content type='html'>&lt;p&gt;ブログなどのウェブ・ページに自分の意見や主張や考えを掲載するときにそれを裏付けるデータがあると説得力が増すかもしれない。そのデータをチャートとして描いて視覚化できれば尚更。&lt;/p&gt;
&lt;p&gt;その場合、一般的なのはそれを専門にしている表計算アプリを使うこと。表計算ソフトウェアにはデータを各種チャートの形にして視覚化してくれる機能が大抵備わっている。LibreOfficeのCalcの場合、そのチャートをコピーしてInkscape上に貼り付けることができる。それをPNG形式の画像やSVG形式の画像として保存し、それをウェブ・ページに掲載する方法がある。&lt;/p&gt;
&lt;p&gt;他の選択肢としては、HTML5 CanvasやJavaScriptのライブラリを使う手がある。データを視覚化してくれるJavaScriptのライブラリが最近では数え切れないくらい多くある。&lt;/p&gt;
&lt;p&gt;今回はGoogle Chartsのライブラリを利用させていただいた。その手順についてこの投稿に書き留める。&lt;/p&gt;
&lt;h4&gt;2種類のチャートの完成図&lt;/h4&gt;
&lt;p&gt;同じデータ・セットで2種類のチャートを作ってみた。その完成図が次のとおり。&lt;/p&gt;
&lt;div id=&quot;chartA&quot;&gt;Google Chartsが有効ではありません。このページを再読み込みをすると有効になることがあります。&lt;/div&gt;
&lt;p&gt;1つ目のチャートは日本のマクロ経済のインフレ率の時系列データを折線グラフにしたもの。&lt;/p&gt;
&lt;p&gt;2つ目のチャートは同じ時系列データを縦の棒グラフにしたもの。棒グラフだと0に近い値が見えなくなってしまっているためか、そこにマウスのポインタを合わせても値を表示してくれるイベント処理が機能しない。&lt;/p&gt;
&lt;div id=&quot;chartB&quot;&gt;Google Chartsが有効ではありません。このページを再読み込みすると有効になることがあります。&lt;/div&gt;
&lt;p&gt;これらのチャートを描くためのコードをHTMLから順に説明する。&lt;/p&gt;
&lt;h4&gt;HTMLのコード&lt;/h4&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ja&quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
&amp;lt;title&amp;gt;Google Chartでチャートを描いてみた&amp;lt;/title&amp;gt;
&amp;lt;!-- loader.jsを読み込む --&amp;gt;
&amp;lt;script src=&quot;https://www.gstatic.com/charts/loader.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- --&amp;gt;
&amp;lt;div id=&quot;chartA&quot;&amp;gt;Google Chartsが有効ではありません。&amp;lt;/div&amp;gt;
&amp;lt;div id=&quot;chartB&quot;&amp;gt;Google Chartsが有効ではありません。&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script defer&amp;gt;
&amp;lt;!-- ここにJavaScriptのソースコードを記述 --&amp;gt;
&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;チャートを埋め込むHTML文書を用意。&lt;/li&gt;
&lt;li&gt;div要素にid属性を与えてbody要素内のチャートを埋め込みたい場所に置く。&lt;/li&gt;
&lt;li&gt;loader.jsの場所をsrc属性に持つ1つ目のscript要素をhead要素内に置く。&lt;/li&gt;
&lt;li&gt;JavaScriptのコードをHTMLのソース内に埋め込むための2つ目のscript要素をhead要素内に置く。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;JavaScriptのコードが最後に読み込まれることを期待してここでは2つ目のscript要素をbody要素の下に置くことにした。&lt;/p&gt;
&lt;p&gt;script要素のtype属性はデフォルトで&quot;text/javascript&quot;なのでtype属性を省略した。&lt;/p&gt;
&lt;p&gt;JavaScriptのコードをHTML文書の中に直接埋め込まずに別のファイルに分離してもオーケー。その場合にはscript要素にsrc属性を設けてその値としてJavaScriptのソースコードの場所とそのファイル名（拡張子は.js）を指定する必要がある。&lt;/p&gt;
&lt;p&gt;チャートを貼り付ける場所はHTML文書のbody要素の中にdiv要素を用いて指定する。チャートの数だけ用意し、それぞれにid属性を割り振っておく。&lt;/p&gt;
&lt;p&gt;今回は2つのチャートを描画するため、2つのdiv要素を記した。それぞれに異なるidを持つ。&lt;/p&gt;
&lt;h4&gt;JavaScriptのコード&lt;/h4&gt;
&lt;p&gt;ここで使用したJavaScriptのコードの内容は次のとおり。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;script defer&amp;gt;
// 匿名関数でコード全体を袋とじ
(function() {

   // データセットを連想配列として定義
   const dataSet = [
      {&quot;年&quot;:&quot;1960&quot;,&quot;インフレ率&quot;:3.57},
      {&quot;年&quot;:&quot;1961&quot;,&quot;インフレ率&quot;:5.36},
      {&quot;年&quot;:&quot;1962&quot;,&quot;インフレ率&quot;:6.83},
      {&quot;年&quot;:&quot;1963&quot;,&quot;インフレ率&quot;:6.7},
      {&quot;年&quot;:&quot;1964&quot;,&quot;インフレ率&quot;:3.8},
      {&quot;年&quot;:&quot;1965&quot;,&quot;インフレ率&quot;:6.65},
      {&quot;年&quot;:&quot;1966&quot;,&quot;インフレ率&quot;:5.04},
      {&quot;年&quot;:&quot;1967&quot;,&quot;インフレ率&quot;:3.98},
      {&quot;年&quot;:&quot;1968&quot;,&quot;インフレ率&quot;:5.33},
      {&quot;年&quot;:&quot;1969&quot;,&quot;インフレ率&quot;:5.24},
      {&quot;年&quot;:&quot;1970&quot;,&quot;インフレ率&quot;:6.92},
      {&quot;年&quot;:&quot;1971&quot;,&quot;インフレ率&quot;:6.39},
      {&quot;年&quot;:&quot;1972&quot;,&quot;インフレ率&quot;:4.84},
      {&quot;年&quot;:&quot;1973&quot;,&quot;インフレ率&quot;:11.6},
      {&quot;年&quot;:&quot;1974&quot;,&quot;インフレ率&quot;:23.22},
      {&quot;年&quot;:&quot;1975&quot;,&quot;インフレ率&quot;:11.73},
      {&quot;年&quot;:&quot;1976&quot;,&quot;インフレ率&quot;:9.37},
      {&quot;年&quot;:&quot;1977&quot;,&quot;インフレ率&quot;:8.16},
      {&quot;年&quot;:&quot;1978&quot;,&quot;インフレ率&quot;:4.2},
      {&quot;年&quot;:&quot;1979&quot;,&quot;インフレ率&quot;:3.7},
      {&quot;年&quot;:&quot;1980&quot;,&quot;インフレ率&quot;:7.77},
      {&quot;年&quot;:&quot;1981&quot;,&quot;インフレ率&quot;:4.91},
      {&quot;年&quot;:&quot;1982&quot;,&quot;インフレ率&quot;:2.74},
      {&quot;年&quot;:&quot;1983&quot;,&quot;インフレ率&quot;:1.89},
      {&quot;年&quot;:&quot;1984&quot;,&quot;インフレ率&quot;:2.26},
      {&quot;年&quot;:&quot;1985&quot;,&quot;インフレ率&quot;:2.03},
      {&quot;年&quot;:&quot;1986&quot;,&quot;インフレ率&quot;:0.59},
      {&quot;年&quot;:&quot;1987&quot;,&quot;インフレ率&quot;:0.12},
      {&quot;年&quot;:&quot;1988&quot;,&quot;インフレ率&quot;:0.67},
      {&quot;年&quot;:&quot;1989&quot;,&quot;インフレ率&quot;:2.27},
      {&quot;年&quot;:&quot;1990&quot;,&quot;インフレ率&quot;:3.07},
      {&quot;年&quot;:&quot;1991&quot;,&quot;インフレ率&quot;:3.25},
      {&quot;年&quot;:&quot;1992&quot;,&quot;インフレ率&quot;:1.76},
      {&quot;年&quot;:&quot;1993&quot;,&quot;インフレ率&quot;:1.24},
      {&quot;年&quot;:&quot;1994&quot;,&quot;インフレ率&quot;:0.69},
      {&quot;年&quot;:&quot;1995&quot;,&quot;インフレ率&quot;:-0.12},
      {&quot;年&quot;:&quot;1996&quot;,&quot;インフレ率&quot;:0.13},
      {&quot;年&quot;:&quot;1997&quot;,&quot;インフレ率&quot;:1.74},
      {&quot;年&quot;:&quot;1998&quot;,&quot;インフレ率&quot;:0.66},
      {&quot;年&quot;:&quot;1999&quot;,&quot;インフレ率&quot;:-0.34},
      {&quot;年&quot;:&quot;2000&quot;,&quot;インフレ率&quot;:-0.67},
      {&quot;年&quot;:&quot;2001&quot;,&quot;インフレ率&quot;:-0.74},
      {&quot;年&quot;:&quot;2002&quot;,&quot;インフレ率&quot;:-0.92},
      {&quot;年&quot;:&quot;2003&quot;,&quot;インフレ率&quot;:-0.25},
      {&quot;年&quot;:&quot;2004&quot;,&quot;インフレ率&quot;:0},
      {&quot;年&quot;:&quot;2005&quot;,&quot;インフレ率&quot;:-0.28},
      {&quot;年&quot;:&quot;2006&quot;,&quot;インフレ率&quot;:0.24},
      {&quot;年&quot;:&quot;2007&quot;,&quot;インフレ率&quot;:0.06},
      {&quot;年&quot;:&quot;2008&quot;,&quot;インフレ率&quot;:1.38},
      {&quot;年&quot;:&quot;2009&quot;,&quot;インフレ率&quot;:1.35},
      {&quot;年&quot;:&quot;2010&quot;,&quot;インフレ率&quot;:-0.71},
      {&quot;年&quot;:&quot;2011&quot;,&quot;インフレ率&quot;:-0.26},
      {&quot;年&quot;:&quot;2012&quot;,&quot;インフレ率&quot;:-0.05},
      {&quot;年&quot;:&quot;2013&quot;,&quot;インフレ率&quot;:0.34},
      {&quot;年&quot;:&quot;2014&quot;,&quot;インフレ率&quot;:2.76},
      {&quot;年&quot;:&quot;2015&quot;,&quot;インフレ率&quot;:0.78},
      {&quot;年&quot;:&quot;2016&quot;,&quot;インフレ率&quot;:-0.11},
      {&quot;年&quot;:&quot;2017&quot;,&quot;インフレ率&quot;:0.46},
      {&quot;年&quot;:&quot;2018&quot;,&quot;インフレ率&quot;:0.97},
      {&quot;年&quot;:&quot;2019&quot;,&quot;インフレ率&quot;:0.47},
      {&quot;年&quot;:&quot;2020&quot;,&quot;インフレ率&quot;:-0.01}
   ]

   // 配列dataSetの第1要素の2つのキー名を取得
   const dataKey = Object.keys(dataSet[0]);
   const dataKey1 = dataKey[0];
   const dataKey2 = dataKey[1];

   // オブジェクト定数
   const cht = google.charts;

   // Google Chartsのパッケージを読み込む
   cht.load(
      &#39;current&#39;, // バージョン
      {&#39;packages&#39;:[&#39;corechart&#39;], // パッケージ名
      &#39;language&#39;:&#39;ja&#39;,} // ロケール
   );

   // パッケージの読込完了後に呼び出す匿名函数を定義
   cht.setOnLoadCallback(
      function() {
         // 函数を呼び出す（引数はデータセットと標題）
         drawChartA(&#39;chartA&#39;, &#39;LineChart&#39;,
            dataSet, &#39;日本のインフレ率 1960-2020&#39;);
         drawChartB(&#39;chartB&#39;, &#39;ColumnChart&#39;,
            &#39;dataSet, &#39;日本のインフレ率 1960-2020&#39;);
      }
   );

   // チャートを描く函数A（引数はデータセットと標題）
   function drawChartA(div, chartType, data, title) {
      // データ表のオブジェクトを作成
      const dTable = new google.visualization.DataTable();

      // データ表の列のデータ型と列名を定義 
      dTable.addColumn(typeof data[0][dataKey1], dataKey1);
      dTable.addColumn(typeof data[0][dataKey2], dataKey2);
   
      // データセットから値を順番に取り出してデータ表の行に入力
      for (let i = 0; i &amp;lt; data.length; i++) {
         dTable.addRow( [data[i][dataKey1], data[i][dataKey2]] );
      }

      // チャートの標題などのオプションを定義
      const options = {
         &#39;title&#39;: title, // チャートの標題
         &#39;width&#39;:670, // 幅
         &#39;height&#39;:500 // 高さ
      };

      // 折線グラフのオブジェクトを作成
      const chart = new google.visualization[chartType](
         document.getElementById(div)); // div要素を取得

      // チャートを描く（引数はデータ表とオプション）
      chart.draw(dTable, options);
   
   }

})(); // 袋とじのための匿名函数の終わり
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以下はJavaScriptのコードについての説明。&lt;/p&gt;
&lt;p&gt;まず、インフレ率の数値とその年を時系列に並べたデータ・セットを連想配列オブジェクトとして定義した。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;// データ・セットを連想配列として定義
const dataSet = [
   {&quot;年&quot;:&quot;1960&quot;,&quot;インフレ率&quot;:3.57},
   {&quot;年&quot;:&quot;1961&quot;,&quot;インフレ率&quot;:5.36},
   {&quot;年&quot;:&quot;1962&quot;,&quot;インフレ率&quot;:6.83},
   {&quot;年&quot;:&quot;1963&quot;,&quot;インフレ率&quot;:6.7},
   {&quot;年&quot;:&quot;1964&quot;,&quot;インフレ率&quot;:3.8},
   {&quot;年&quot;:&quot;1965&quot;,&quot;インフレ率&quot;:6.65},
   {&quot;年&quot;:&quot;1966&quot;,&quot;インフレ率&quot;:5.04},
   {&quot;年&quot;:&quot;1967&quot;,&quot;インフレ率&quot;:3.98},
   {&quot;年&quot;:&quot;1968&quot;,&quot;インフレ率&quot;:5.33},
   {&quot;年&quot;:&quot;1969&quot;,&quot;インフレ率&quot;:5.24},
   {&quot;年&quot;:&quot;1970&quot;,&quot;インフレ率&quot;:6.92},
   {&quot;年&quot;:&quot;1971&quot;,&quot;インフレ率&quot;:6.39},
   {&quot;年&quot;:&quot;1972&quot;,&quot;インフレ率&quot;:4.84},
   {&quot;年&quot;:&quot;1973&quot;,&quot;インフレ率&quot;:11.6},
   {&quot;年&quot;:&quot;1974&quot;,&quot;インフレ率&quot;:23.22},
   {&quot;年&quot;:&quot;1975&quot;,&quot;インフレ率&quot;:11.73},
   {&quot;年&quot;:&quot;1976&quot;,&quot;インフレ率&quot;:9.37},
   {&quot;年&quot;:&quot;1977&quot;,&quot;インフレ率&quot;:8.16},
   {&quot;年&quot;:&quot;1978&quot;,&quot;インフレ率&quot;:4.2},
   {&quot;年&quot;:&quot;1979&quot;,&quot;インフレ率&quot;:3.7},
   {&quot;年&quot;:&quot;1980&quot;,&quot;インフレ率&quot;:7.77},
   {&quot;年&quot;:&quot;1981&quot;,&quot;インフレ率&quot;:4.91},
   {&quot;年&quot;:&quot;1982&quot;,&quot;インフレ率&quot;:2.74},
   {&quot;年&quot;:&quot;1983&quot;,&quot;インフレ率&quot;:1.89},
   {&quot;年&quot;:&quot;1984&quot;,&quot;インフレ率&quot;:2.26},
   {&quot;年&quot;:&quot;1985&quot;,&quot;インフレ率&quot;:2.03},
   {&quot;年&quot;:&quot;1986&quot;,&quot;インフレ率&quot;:0.59},
   {&quot;年&quot;:&quot;1987&quot;,&quot;インフレ率&quot;:0.12},
   {&quot;年&quot;:&quot;1988&quot;,&quot;インフレ率&quot;:0.67},
   {&quot;年&quot;:&quot;1989&quot;,&quot;インフレ率&quot;:2.27},
   {&quot;年&quot;:&quot;1990&quot;,&quot;インフレ率&quot;:3.07},
   {&quot;年&quot;:&quot;1991&quot;,&quot;インフレ率&quot;:3.25},
   {&quot;年&quot;:&quot;1992&quot;,&quot;インフレ率&quot;:1.76},
   {&quot;年&quot;:&quot;1993&quot;,&quot;インフレ率&quot;:1.24},
   {&quot;年&quot;:&quot;1994&quot;,&quot;インフレ率&quot;:0.69},
   {&quot;年&quot;:&quot;1995&quot;,&quot;インフレ率&quot;:-0.12},
   {&quot;年&quot;:&quot;1996&quot;,&quot;インフレ率&quot;:0.13},
   {&quot;年&quot;:&quot;1997&quot;,&quot;インフレ率&quot;:1.74},
   {&quot;年&quot;:&quot;1998&quot;,&quot;インフレ率&quot;:0.66},
   {&quot;年&quot;:&quot;1999&quot;,&quot;インフレ率&quot;:-0.34},
   {&quot;年&quot;:&quot;2000&quot;,&quot;インフレ率&quot;:-0.67},
   {&quot;年&quot;:&quot;2001&quot;,&quot;インフレ率&quot;:-0.74},
   {&quot;年&quot;:&quot;2002&quot;,&quot;インフレ率&quot;:-0.92},
   {&quot;年&quot;:&quot;2003&quot;,&quot;インフレ率&quot;:-0.25},
   {&quot;年&quot;:&quot;2004&quot;,&quot;インフレ率&quot;:0},
   {&quot;年&quot;:&quot;2005&quot;,&quot;インフレ率&quot;:-0.28},
   {&quot;年&quot;:&quot;2006&quot;,&quot;インフレ率&quot;:0.24},
   {&quot;年&quot;:&quot;2007&quot;,&quot;インフレ率&quot;:0.06},
   {&quot;年&quot;:&quot;2008&quot;,&quot;インフレ率&quot;:1.38},
   {&quot;年&quot;:&quot;2009&quot;,&quot;インフレ率&quot;:1.35},
   {&quot;年&quot;:&quot;2010&quot;,&quot;インフレ率&quot;:-0.71},
   {&quot;年&quot;:&quot;2011&quot;,&quot;インフレ率&quot;:-0.26},
   {&quot;年&quot;:&quot;2012&quot;,&quot;インフレ率&quot;:-0.05},
   {&quot;年&quot;:&quot;2013&quot;,&quot;インフレ率&quot;:0.34},
   {&quot;年&quot;:&quot;2014&quot;,&quot;インフレ率&quot;:2.76},
   {&quot;年&quot;:&quot;2015&quot;,&quot;インフレ率&quot;:0.78},
   {&quot;年&quot;:&quot;2016&quot;,&quot;インフレ率&quot;:-0.11},
   {&quot;年&quot;:&quot;2017&quot;,&quot;インフレ率&quot;:0.46},
   {&quot;年&quot;:&quot;2018&quot;,&quot;インフレ率&quot;:0.97},
   {&quot;年&quot;:&quot;2019&quot;,&quot;インフレ率&quot;:0.47},
   {&quot;年&quot;:&quot;2020&quot;,&quot;インフレ率&quot;:-0.01}
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;この連想配列オブジェクトは&quot;年&quot;と&quot;インフレ率&quot;という2つのキーとその値を持っている。&quot;年&quot;の値がstring型で&quot;インフレ率&quot;の値がnumber型。&lt;/p&gt;
&lt;p&gt;Object.keysメソッドを使ってこの連想配列の第1要素から2つのキーを取り出す処理が次のコード。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;// 配列dataSetの第1要素の2つのキー名を取得
const dataKey = Object.keys(dataSet[0]);
const dataKey1 = dataKey[0];
const dataKey2 = dataKey[1];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Object.keysメソッドの引数に連想配列の第1要素を指し示すdataSet[0]を与えた。これによってdataKeyには&quot;年&quot;と&quot;インフレ率&quot;という2つのキーが代入された。そしてそれらをそれぞれ取り出し、dataKey1に&quot;年&quot;を、dataKey2に&quot;インフレ率&quot;を割り当てた。いずれもstring型。&lt;/p&gt;
&lt;p&gt;google.charts.loadメソッドを用いてGoogle Chartsのライブラリを読み込むように指示するのが次のコード。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;const cht = google.charts;
// パッケージを読み込む
cht.load(&#39;current&#39;, // バージョン
    {packages:[&#39;corechart&#39;], // パッケージ
    &#39;language&#39;:&#39;ja&#39;} // ロケール
);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;loadメソッドの第1引数にはバージョンを指定。&#39;current&#39;は公式にリリースされている最新のバージョンを意味している。&#39;upcoming&#39;とすると、公式にまだリリースされていないテスト・バージョンを指定したことになる。&lt;/p&gt;
&lt;p&gt;バージョンを固定したい場合にはバージョン番号を直接指定する。&lt;/p&gt;
&lt;p&gt;loadメソッドの第2引数はいくつかの設定をするためにあり、波括弧の中に複数の項目をカンマで区切って指定できる。そのうちpackageは必須。&#39;corechart&#39;を指定すると、用意されている基本的なチャート・クラスをインスタンス化して利用できるようになる。&lt;/p&gt;
&lt;p&gt;packageの値は角括弧の中にカンマで区切って複数指定できる。例えば次のように。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;cht.load(&#39;current&#39;,
    // 複数のパッケージを読み込む
    {packages:[&#39;corechart&#39;,&#39;table&#39;,&#39;&#39;geochart&#39;],
    &#39;language&#39;:&#39;ja&#39;}
);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;loadメソッドの第2引数の2つ目には&#39;language&#39;としてロケールを指定した。これは言語や通貨単位などを特定するためのもの。jaが日本語や日本の通貨単位（円）を意味する。チャートに日本語の文字列を描画したければ指定しておいたほうがよいかもしれない。&lt;/p&gt;
&lt;p&gt;次にコールバック函数を登録する。この函数はパッケージの読み込みが完了した後に呼び出されるためのもの。C言語で言えばmain函数に当たるようなものだろうか。&lt;/p&gt;
&lt;p&gt;これを行うにはsetOnLoadCallbackメソッドを用いてその引数に匿名函数を与える方法がある。例えば次のように。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;// パッケージの読込完了後に呼び出す匿名函数を定義
cht.setOnLoadCallback(
   function() {
      // 函数を呼び出す（引数はデータ・セットと標題）
      drawChartA(&#39;chartA&#39;, &#39;LineChart&#39;,
         dataSet, &#39;日本のインフレ率 1960-2020&#39;);
      drawChartB(&#39;chartB&#39;, &#39;ColumnChart&#39;,
         dataSet, &#39;日本のインフレ率 1960-2020&#39;);
   }
);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;この匿名函数の中には、各々のチャートを作成するためにこれから定義する函数を呼び出すステートメントが2つある。それらの引数には、HTMLのdiv要素のid、チャートのタイプ名、データ・セット、チャートの標題を与える必要があるようにしてある。&lt;/p&gt;
&lt;h4&gt;各々のチャートを作成する函数を定義&lt;/h4&gt;
&lt;p&gt;チャートを描くための函数を1つ定義した。函数名はdrawChart。この函数はdiv要素のid名(div)とチャートのタイプ名(chartType)とデータ・セット(data)とチャートの標題(title)の4つの引数を受け取るようにした。函数呼び出すステートメントでこれらの引数の値を具体的に指定する。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;function drawChartA(div, chartType, data, title) {
// ここのブロックに函数の内容をコーディング
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;この函数のブロックの中ではまずデータ・テーブルを作成する。データ・テーブルとは列(a column)と行(a row)の形式にデータを並べた表のこと。作成するチャートに適合したデータ・テーブルを用意する必要がある。&lt;/p&gt;
&lt;p&gt;そのためにデータ・テーブルのコンストラクタ函数（クラス）からオブジェクトを作成。いわゆるインスタンス化。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;const dTable = new google.visualization.DataTable();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次にaddColumnメソッドを用いてデータ・テーブルの各列のデータ型とラベル名を設定。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;dTable.addColumn(typeof data[0][dataKey1], dataKey1);
dTable.addColumn(typeof data[0][dataKey2], dataKey2);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;addColumnメソッドの第1引数にはデータ型を、その第2引数には列名を指定する。値の指定に定数を使っているので分かりにくいが、要するに次のように指定したことと同じこと。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;dTable.addColumn(&#39;string&#39;, &#39;年&#39;);
dTable.addColumn(&#39;number&#39;, &#39;インフレ率&#39;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;定数を用いることで別のデータ・セットにしたときにも対応できるコードにした。ただしそのデータ・セットは同じ形式の連想配列である必要がある。&lt;/p&gt;
&lt;p&gt;addRowメソッドを用いてデータ・テーブルに値を追加していく処理が次のコード。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;for (let i = 0; i &amp;lt; data.length; i++) {
   dTable.addRow( [data[i][dataKey1], data[i][dataKey2]] );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;その引数に定数を指定しているので分かりにくいが、要するに、addRowメソッドの第1引数に&quot;年&quot;の値を、その第2引数に&quot;インフレ率&quot;の値をそれぞれ指定していることと同じ。&lt;/p&gt;
&lt;p&gt;for文なのでカウンター変数iが0から順番に1つずつ増えていきながら連想配列の長さぶんだけこの処理が繰り返される。こうして連想配列の値がデータ・テーブルに転記されるようになるはず。&lt;/p&gt;
&lt;p&gt;JavaScriptでの連想配列（オブジェクトの一種）の取扱いについての詳細はまたの機会に。&lt;/p&gt;
&lt;p&gt;次のコードではオプションを指定している。オプションとはこのチャートに与える様々な属性のこと。プロパティか。あるいは引数か。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;const options = {
   &#39;title&#39;: title, // チャートの標題
   &#39;width&#39;:670, // 幅
   &#39;height&#39;:500 // 高さ
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最初は文字通りこのチャートのタイトル(title)。2つめはチャートの幅(width)。3つめはチャートの高さ(height)。&lt;/p&gt;
&lt;p&gt;次のコードではライン・チャート（折線グラフ）のコンストラクタ函数（クラス）からオブジェクト（インスタンス）を作成している。その引数にはgetElementByIdメソッドを使ってdiv要素を取得して与えている。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;const chart = new google.visualization[chartType](
   document.getElementById(div));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このコードは本来は次のようなものだが、チャート・タイプ名の部分とdiv要素のidの部分をこの函数が引数として受け取るようにした。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;const chart = new google.visualization.チャート・タイプ名(
   document.getElementById(&#39;div要素のid&#39;));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Google Chartsにはどのようなチャート・クラスが用意されているかを知るには、Google Chartsの&lt;a href=&quot;https://developers.google.com/chart&quot;&gt;ウェブ・サイト&lt;/a&gt;を開き、ナビゲート・メニューの「Guides」から「Chart Types」の一覧を参照する。「Chart Gallery」を見ると各種チャートの完成図を見ながら選びやすい。そこにそれぞれのチャートの利用方法が（英文だけど）書かれてある。&lt;/p&gt;
&lt;p&gt;最後にdrawメソッドを使ってその引数にデータ・テーブルと先ほど定義したoptionsを指定し、チャートを描けばこの函数は終わり。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;chart.draw(dTable, options);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JavaScriptのコード全体を匿名函数で袋とじした。こうすることで擬似的な名前空間になり、函数名、変数名、定数名などの識別子の競合（上書きなど）を防ぐことができるはず。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;(function() {
// ここにコード全体を記述
})();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このコードを基盤にすれば、データ・セットを与えればそれをチャートとして視覚化してくれるウェブ・アプリを作ることができるかもしれない。その試みはまたの機会に。&lt;/p&gt;
参照元：&lt;ul class=&quot;nonliststyle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/chart/&quot;&gt;Google Chartsの公式ページ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
関連する投稿：&lt;ul class=&quot;nonliststyle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2021/09/html5-canvasjavascript.html&quot;&gt;HTML5 CanvasとJavaScriptで折線グラフを描いてみた&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--Load the AJAX API--&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://www.gstatic.com/charts/loader.js&quot;&gt;&lt;/script&gt;
&lt;script defer&gt;
// 匿名関数でコード全体を袋とじ
(function() {

   // データセットを連想配列として定義
   const dataSet = [
      {&quot;年&quot;:&quot;1960&quot;,&quot;インフレ率&quot;:3.57},
      {&quot;年&quot;:&quot;1961&quot;,&quot;インフレ率&quot;:5.36},
      {&quot;年&quot;:&quot;1962&quot;,&quot;インフレ率&quot;:6.83},
      {&quot;年&quot;:&quot;1963&quot;,&quot;インフレ率&quot;:6.7},
      {&quot;年&quot;:&quot;1964&quot;,&quot;インフレ率&quot;:3.8},
      {&quot;年&quot;:&quot;1965&quot;,&quot;インフレ率&quot;:6.65},
      {&quot;年&quot;:&quot;1966&quot;,&quot;インフレ率&quot;:5.04},
      {&quot;年&quot;:&quot;1967&quot;,&quot;インフレ率&quot;:3.98},
      {&quot;年&quot;:&quot;1968&quot;,&quot;インフレ率&quot;:5.33},
      {&quot;年&quot;:&quot;1969&quot;,&quot;インフレ率&quot;:5.24},
      {&quot;年&quot;:&quot;1970&quot;,&quot;インフレ率&quot;:6.92},
      {&quot;年&quot;:&quot;1971&quot;,&quot;インフレ率&quot;:6.39},
      {&quot;年&quot;:&quot;1972&quot;,&quot;インフレ率&quot;:4.84},
      {&quot;年&quot;:&quot;1973&quot;,&quot;インフレ率&quot;:11.6},
      {&quot;年&quot;:&quot;1974&quot;,&quot;インフレ率&quot;:23.22},
      {&quot;年&quot;:&quot;1975&quot;,&quot;インフレ率&quot;:11.73},
      {&quot;年&quot;:&quot;1976&quot;,&quot;インフレ率&quot;:9.37},
      {&quot;年&quot;:&quot;1977&quot;,&quot;インフレ率&quot;:8.16},
      {&quot;年&quot;:&quot;1978&quot;,&quot;インフレ率&quot;:4.2},
      {&quot;年&quot;:&quot;1979&quot;,&quot;インフレ率&quot;:3.7},
      {&quot;年&quot;:&quot;1980&quot;,&quot;インフレ率&quot;:7.77},
      {&quot;年&quot;:&quot;1981&quot;,&quot;インフレ率&quot;:4.91},
      {&quot;年&quot;:&quot;1982&quot;,&quot;インフレ率&quot;:2.74},
      {&quot;年&quot;:&quot;1983&quot;,&quot;インフレ率&quot;:1.89},
      {&quot;年&quot;:&quot;1984&quot;,&quot;インフレ率&quot;:2.26},
      {&quot;年&quot;:&quot;1985&quot;,&quot;インフレ率&quot;:2.03},
      {&quot;年&quot;:&quot;1986&quot;,&quot;インフレ率&quot;:0.59},
      {&quot;年&quot;:&quot;1987&quot;,&quot;インフレ率&quot;:0.12},
      {&quot;年&quot;:&quot;1988&quot;,&quot;インフレ率&quot;:0.67},
      {&quot;年&quot;:&quot;1989&quot;,&quot;インフレ率&quot;:2.27},
      {&quot;年&quot;:&quot;1990&quot;,&quot;インフレ率&quot;:3.07},
      {&quot;年&quot;:&quot;1991&quot;,&quot;インフレ率&quot;:3.25},
      {&quot;年&quot;:&quot;1992&quot;,&quot;インフレ率&quot;:1.76},
      {&quot;年&quot;:&quot;1993&quot;,&quot;インフレ率&quot;:1.24},
      {&quot;年&quot;:&quot;1994&quot;,&quot;インフレ率&quot;:0.69},
      {&quot;年&quot;:&quot;1995&quot;,&quot;インフレ率&quot;:-0.12},
      {&quot;年&quot;:&quot;1996&quot;,&quot;インフレ率&quot;:0.13},
      {&quot;年&quot;:&quot;1997&quot;,&quot;インフレ率&quot;:1.74},
      {&quot;年&quot;:&quot;1998&quot;,&quot;インフレ率&quot;:0.66},
      {&quot;年&quot;:&quot;1999&quot;,&quot;インフレ率&quot;:-0.34},
      {&quot;年&quot;:&quot;2000&quot;,&quot;インフレ率&quot;:-0.67},
      {&quot;年&quot;:&quot;2001&quot;,&quot;インフレ率&quot;:-0.74},
      {&quot;年&quot;:&quot;2002&quot;,&quot;インフレ率&quot;:-0.92},
      {&quot;年&quot;:&quot;2003&quot;,&quot;インフレ率&quot;:-0.25},
      {&quot;年&quot;:&quot;2004&quot;,&quot;インフレ率&quot;:0},
      {&quot;年&quot;:&quot;2005&quot;,&quot;インフレ率&quot;:-0.28},
      {&quot;年&quot;:&quot;2006&quot;,&quot;インフレ率&quot;:0.24},
      {&quot;年&quot;:&quot;2007&quot;,&quot;インフレ率&quot;:0.06},
      {&quot;年&quot;:&quot;2008&quot;,&quot;インフレ率&quot;:1.38},
      {&quot;年&quot;:&quot;2009&quot;,&quot;インフレ率&quot;:1.35},
      {&quot;年&quot;:&quot;2010&quot;,&quot;インフレ率&quot;:-0.71},
      {&quot;年&quot;:&quot;2011&quot;,&quot;インフレ率&quot;:-0.26},
      {&quot;年&quot;:&quot;2012&quot;,&quot;インフレ率&quot;:-0.05},
      {&quot;年&quot;:&quot;2013&quot;,&quot;インフレ率&quot;:0.34},
      {&quot;年&quot;:&quot;2014&quot;,&quot;インフレ率&quot;:2.76},
      {&quot;年&quot;:&quot;2015&quot;,&quot;インフレ率&quot;:0.78},
      {&quot;年&quot;:&quot;2016&quot;,&quot;インフレ率&quot;:-0.11},
      {&quot;年&quot;:&quot;2017&quot;,&quot;インフレ率&quot;:0.46},
      {&quot;年&quot;:&quot;2018&quot;,&quot;インフレ率&quot;:0.97},
      {&quot;年&quot;:&quot;2019&quot;,&quot;インフレ率&quot;:0.47},
      {&quot;年&quot;:&quot;2020&quot;,&quot;インフレ率&quot;:-0.01}
   ]

   // 配列dataSetの第1要素の2つのキー名を取得
   const dataKey = Object.keys(dataSet[0]);
   const dataKey1 = dataKey[0];
   const dataKey2 = dataKey[1];

   // オブジェクト変数
   const cht = google.charts;

   // Google Chartsのパッケージを読み込む
   cht.load(
      &#39;current&#39;, // バージョン
      {&#39;packages&#39;:[&#39;corechart&#39;], // パッケージ名
      &#39;language&#39;:&#39;ja&#39;,} // ロケール
   );

   // パッケージの読込完了後に呼び出す匿名函数を定義
   cht.setOnLoadCallback(
      function() {
         // 函数を呼び出す（引数はデータセットと標題）
         drawChart(&#39;chartA&#39;, &#39;LineChart&#39;,
            dataSet, &#39;日本のインフレ率 1960-2020&#39;);
         drawChart(&#39;chartB&#39;, &#39;ColumnChart&#39;,
            dataSet, &#39;日本のインフレ率 1960-2020&#39;);
      }
   );

   // チャートを描く函数A（引数はデータセットと標題）
   function drawChart(div, chartType, data, title) {
      // データ表のオブジェクトを作成
      const dTable = new google.visualization.DataTable();

      // データ表の列のデータ型と列名を定義 
      dTable.addColumn(typeof data[0][dataKey1], dataKey1);
      dTable.addColumn(typeof data[0][dataKey2], dataKey2);
   
      // データセットから値を順番に取り出してデータ表の行に入力
      for (let i = 0; i &lt; data.length; i++) {
         dTable.addRow( [data[i][dataKey1], data[i][dataKey2]] );
      }

      // チャートの標題などのオプションを定義
      const options = {
         &#39;title&#39;: title, // チャートの標題
         &#39;width&#39;:670, // 幅
         &#39;height&#39;:500 // 高さ
      };

      // 折線グラフのオブジェクトを作成
      const chart = new google.visualization[chartType](
         document.getElementById(div)); // div要素を取得

      // チャートを描く（引数はデータ表とオプション）
      chart.draw(dTable, options);
   
   }

})(); // 袋とじのための匿名函数の終わり
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/8912341564155553392/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2021/09/google-chartshp_21.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/8912341564155553392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/8912341564155553392'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2021/09/google-chartshp_21.html' title='Google Chartsを利用してHPやブログにチャート（グラフ等）を描く方法'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-8939670915748651750</id><published>2021-09-20T20:51:00.004+09:00</published><updated>2021-09-20T20:56:31.030+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="LibreOffice"/><category scheme="http://www.blogger.com/atom/ns#" term="LibreOffice Calc"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenOffice"/><title type='text'>LibreOfficeで列と行を置き換える（転置）</title><content type='html'>&lt;p&gt;使用したLibreOfficeのバージョンは6.1。現時点の最新版が7.2なので少し古い。&lt;/p&gt;
&lt;p&gt;列方向に並んでいる値を行方向に並ぶように置き換えたい。行方向に並んでいる値を列方向に並ぶように置き換えたい。この投稿では、いわゆる「行列の転置」をLibreOffice Calcで行う2つの方法について書き留めておく。&lt;/p&gt;
&lt;p&gt;例えば次のように値がセルに入力されているとする。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr style=&quot;background-color: silver;&quot;&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;C&lt;/th&gt;
&lt;th&gt;D&lt;/th&gt;
&lt;th&gt;E&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;1&lt;/th&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;2&lt;/th&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;3&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;4&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;5&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これを次のようにしたい。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr style=&quot;background-color: silver;&quot;&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;C&lt;/th&gt;
&lt;th&gt;D&lt;/th&gt;
&lt;th&gt;E&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;1&lt;/th&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;2&lt;/th&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;3&lt;/th&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;4&lt;/th&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;5&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;h4&gt;1つめの方法&lt;/h4&gt;
&lt;p&gt;まず、変換したい値全体を選んでアクティブセルにする。そしてトップメニューの「編集」などから「切り取り」または「コピー」を選ぶ。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr style=&quot;background-color: silver;&quot;&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th style=&quot;background-color: rgb(96,80,220);&quot;&gt;A&lt;/th&gt;
&lt;th style=&quot;background-color: rgb(96,80,220);&quot;&gt;B&lt;/th&gt;
&lt;th style=&quot;background-color: rgb(96,80,220);&quot;&gt;C&lt;/th&gt;
&lt;th style=&quot;background-color: rgb(96,80,220);&quot;&gt;D&lt;/th&gt;
&lt;th&gt;E&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: rgb(96,80,220);&quot;&gt;1&lt;/th&gt;
&lt;td style=&quot;background-color: rgb(162,162,208);&quot;&gt;a&lt;/td&gt;
&lt;td style=&quot;background-color: rgb(162,162,208);&quot;&gt;b&lt;/td&gt;
&lt;td style=&quot;background-color: rgb(162,162,208);&quot;&gt;c&lt;/td&gt;
&lt;td style=&quot;background-color: rgb(162,162,208);&quot;&gt;d&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: rgb(96,80,220);&quot;&gt;2&lt;/th&gt;
&lt;td style=&quot;background-color: rgb(162,162,208);&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;background-color: rgb(162,162,208);&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;background-color: rgb(162,162,208);&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;background-color: rgb(162,162,208);&quot;&gt;4&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;3&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;4&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;5&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;転置後の値が入るセルの範囲の一番左上端になるセルを選んでアクティブにする。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr style=&quot;background-color: silver;&quot;&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th style=&quot;background-color: rgb(96,80,220);&quot;&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;C&lt;/th&gt;
&lt;th&gt;D&lt;/th&gt;
&lt;th&gt;E&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: rgb(96,80,220);&quot;&gt;1&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;2&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;3&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;4&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;5&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;トップメニューの「編集」などから「形式を選択して貼り付け」を選ぶ。&lt;/p&gt;
&lt;p&gt;このバージョン(6.1.5.2)のLibreOffice Calcではこの操作でLibreOffice Calc自体が固まってしまう現象が環境によっては起こるので要注意。&lt;/p&gt;
&lt;p&gt;「形式を選択して貼り付け」というダイアログボックスが開くのでその中の「行と列を入れ替える」というボタンを押す。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr style=&quot;background-color: silver;&quot;&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;C&lt;/th&gt;
&lt;th&gt;D&lt;/th&gt;
&lt;th&gt;E&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;1&lt;/th&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;2&lt;/th&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;3&lt;/th&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;4&lt;/th&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th style=&quot;background-color: silver;&quot;&gt;5&lt;/th&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;h4&gt;2つめの方法&lt;/h4&gt;
&lt;p&gt;2つめの方法はLibreOffice Calcに組み込まれている函数を使うこと。LibreOffice CalcにもMS Excel同様に転置行列を生成してくれる函数がある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;転置後の値を入れたいセルの内で一番左上端のセルを選んでアクティブにする。&lt;/li&gt;
&lt;li&gt;トップメニューの「挿入」などから「関数」を選んで「関数ウィザード」を表示させる。
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxIENaS6zztm3WhsrFq5dwCJLl4wI4pmqpEBqI7aSiNqwWD-2BtGFTWauw7q3ZSTTCdKc1Yn5EjyGURRDw7jkRhBZqirJauCS4dpKupnBhXYLbDVWL-cP5ATbhQl0Z1FWtJnoMCyvcAWpu/s0/libreOfficeCalc_formPaste.png&quot; style=&quot;display: block; padding: 1em 0; text-align: center; &quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; data-original-height=&quot;376&quot; data-original-width=&quot;347&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxIENaS6zztm3WhsrFq5dwCJLl4wI4pmqpEBqI7aSiNqwWD-2BtGFTWauw7q3ZSTTCdKc1Yn5EjyGURRDw7jkRhBZqirJauCS4dpKupnBhXYLbDVWL-cP5ATbhQl0Z1FWtJnoMCyvcAWpu/s0/libreOfficeCalc_formPaste.png&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;「関数ウィザード」の「分類項目」で「行列」を選ぶ。&lt;/li&gt;
&lt;li&gt;「TRANSPOSE」という関数を選んで「次へ」を押す。
&lt;p&gt;この時点で「結果」というフォームに「エラー:511」と表示されてしまうが気にしない。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;「行列」という項目の入力フォームの右側にあるボタンを押す。&lt;/li&gt;
&lt;li&gt;転置したい値が入るセル全体を選んでアクティブにする。例えばA1からC2まで。そうしておいてEnterキーを押す。&lt;/li&gt;
&lt;li&gt;そうすると関数ウィザードの数式のフォームに例えば「=TRANSPOSE(A1:C2)」と表示されるはず。それを確認してOKボタンを押す。&lt;/li&gt;
&lt;p&gt;これで行列の転置が行われるはず。&lt;/p&gt;
&lt;p&gt;LibreOffice Calcを使った行列の各種演算についてはまたの機会に。&lt;/p&gt;
&lt;/ol&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/8939670915748651750/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2021/09/libreoffice.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/8939670915748651750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/8939670915748651750'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2021/09/libreoffice.html' title='LibreOfficeで列と行を置き換える（転置）'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxIENaS6zztm3WhsrFq5dwCJLl4wI4pmqpEBqI7aSiNqwWD-2BtGFTWauw7q3ZSTTCdKc1Yn5EjyGURRDw7jkRhBZqirJauCS4dpKupnBhXYLbDVWL-cP5ATbhQl0Z1FWtJnoMCyvcAWpu/s72-c/libreOfficeCalc_formPaste.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-5777112928691410008</id><published>2021-09-15T22:01:00.038+09:00</published><updated>2025-09-04T10:07:56.762+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Canvas"/><category scheme="http://www.blogger.com/atom/ns#" term="HTML5"/><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><title type='text'>HTML5 CanvasとJavaScriptで折線グラフを描いてみた</title><content type='html'>&lt;p&gt;使用した環境は次のとおり。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chromium Version 90.0&lt;/li&gt;
&lt;li&gt;Firefox Browser 78.13.0esr&lt;/li&gt;
&lt;li&gt;ECMAScript 6 (2015)以降&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ECMAScriptはJavaScriptの標準規格。そのバージョンの6以降または2015以降では変数の宣言にletというキーワードが導入された。定数の宣言にはconstというキーワードが導入された。ただしletは予約語ではない。この投稿で掲載するJavaScriptのコードではletとconstを用いた。&lt;/p&gt;
&lt;p&gt;JavaScriptにおける変数の詳細についてはまた別の機会に。&lt;/p&gt;
&lt;br&gt;
&lt;h4&gt;HTML5 Canvasで描いた折線グラフ&lt;/h4&gt;
&lt;p&gt;日本のマクロ経済データの1つであるインフレ率を1960年から2020年まで時系列に折線グラフにしたものが次の図。&lt;/p&gt;
&lt;canvas id=&quot;JapanInflationRateTimeSeries1&quot; width=&quot;700&quot; height=&quot;400&quot;&gt;
このブラウザはHTML5 CanvasかJavaScriptをサポートしていません。
&lt;/canvas&gt;
&lt;p&gt;スクリプト言語JavaScriptとHTML5 Canvasの2次元用レンダリングのAPIを利用して今回はこの折線グラフを描いてみた。&lt;/p&gt;
&lt;br&gt;
&lt;h4&gt;HTML&lt;/h4&gt;
&lt;p&gt;HTML5 Canvasを表示するために用意しておくHTML文書の基本的内容は次のとおり。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;日本のインフレ率の折線グラフ&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;!-- canvas要素にはid属性と幅と高さを設定する --&amp;gt;
&amp;lt;canvas id=&quot;JapanInflationRateTimeSeries&quot; width=&quot;700&quot; height=&quot;400&quot;&amp;gt;
このブラウザはHTML5 CanvasかJavaScriptをサポートしていません。
&amp;lt;/canvas&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script&amp;gt;
&amp;lt;!-- ここにJavaScriptのコードを書く --&amp;gt;
&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ウェブ・ブラウザによってscript要素が最後に読み込まれることを期待してscript要素をbody要素の後に置くことにした。&lt;/p&gt;
&lt;p&gt;HTML文書内にスクリプト（JavaScriptのソースコード）を直接埋め込まずに別ファイルに分離させる場合には、HTMLのscript要素のsrc属性にそのソースコードのファイル名とパス名を指定する。例えば次のように。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;script src=&quot;./script/JapanInflationRateTimeSeries.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;body要素内に置いたcanvas要素にはそのcanvas要素固有のidを付けておく必要がある。なぜならばJavaScriptからこのcanvas要素を呼び出すためにこのid属性を用いるので。&lt;/p&gt;
&lt;p&gt;canvas要素のwidth属性にはCanvasの広さを決めるための幅の値を指定する。ここでは700とした。hight属性は高さ。ここでは400とした。描かれた図の一部がはみ出して隠れてしまわないようにその都度これらを調整する。&lt;/p&gt;
&lt;p&gt;HTMLのhead要素内のstyle要素内にCSSを記述してcanvas要素の背景色やら余白やらを設定する方法もあるが、今回はJavaScriptのコードにそれらの設定と描画を任せてみることにした。&lt;/p&gt;
&lt;p&gt;HTML5 CanvasのAPIが用いる座標系では左上端が原点の(0,0)となる。しかしここで描こうとするグラフの座標系は通常のデカルト座標系に基づくものなので、HTML5 Canvas APIが用いる座標系とは上下の向きが逆になる。&lt;/p&gt;
&lt;p&gt;次にJavaScriptのソースコードの内容について説明する。&lt;/p&gt;
&lt;br&gt;
&lt;h4&gt;このスクリプトの設計思想とコードの全体像&lt;/h4&gt;
&lt;p&gt;このスクリプトは大規模でも複雑でもないので、その設計手法はオブジェクト指向的ではなく、C言語の古典的な流儀に近いものにした。&lt;/p&gt;
&lt;p&gt;ただし、函数の定義の中に別の函数の定義が入っている入れ子構造はC言語の古典的な流儀とは異なるかもしれない。函数の定義の中で更に定義された入れ子の函数はクロージャと呼ばれているらしい。&lt;/p&gt;
&lt;p&gt;ソースコードの内容は、函数外の各定数、各変数、そして複数の各函数によって構成されている。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;(function() {
/* 各種定数の定義
   各種変数の宣言と値の割り当て
   各種函数の定義
   各種函数の呼び出し */
})();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;コードを函数に分けることの利点は、コードの見通しがよくなるだけでなく、識別子の名前が重複して上書きされてしまったりするのを函数のブロックを名前空間として使用して防ぐことができること。&lt;/p&gt;
&lt;p&gt;他のスクリプトとの競合を防ぐためにコード全体を匿名函数で更に袋とじにすることにした。&lt;code&gt;(function(){...})();&lt;/code&gt;の部分がそれ。&lt;/p&gt;
&lt;p&gt;変数の宣言にはvarキーワードの代わりにconstキーワードとletキーワードを用いることにした。これらのキーワードはECMAScript 2015 (ES6)から採用されたらしい。ただしletは予約語ではないようだ。&lt;/p&gt;
&lt;p&gt;constで定義した変数は定数であるかのように機能し、letで宣言した変数は全てのブロック内でローカル変数として機能するようになるらしい。&lt;/p&gt;
&lt;p&gt;constキーワードで定義される定数は厳密には定数とは異なるらしい。その詳細についてはまたの機会に。&lt;/p&gt;
&lt;p&gt;for文とif文だけを制御構文として用いた。&lt;/p&gt;
&lt;p&gt;残念ながら汎用性や拡張性が低いコードになっている。機会があれば修正するかもしれない。&lt;/p&gt;
&lt;br&gt;
&lt;h4&gt;函数外の定数を宣言&lt;/h4&gt;
&lt;p&gt;まずは函数の間を跨いで働く各種の定数を函数外で宣言した。定数の宣言にはconstキーワードを用いる。定数の宣言と同時にその値を代入する必要がある。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;// 方眼紙の属性定数
const topMargin = 35; // 上余白
const leftMargin = 30; // 左余白
const verticalGridNum = 65; // 方眼紙の垂直線数
const horizontalGridNum = 30; // 方眼紙の水平線数
const gridSize = 10; // 方眼紙の線間の幅

// 座標系の原点位置を決める定数
const originX = leftMargin + (gridSize * 0); // x座標
const originY = topMargin + (gridSize * 25); // y座標

// 横軸線の始点
const xAxisSX = originX;
const xAxisSY = topMargin;
// 横軸線の終点
const xAxisLX = originX;
const xAxisLY = topMargin + (gridSize * horizontalGridNum);

// 縦軸線の始点
const yAxisSX = leftMargin;
const yAxisSY = originY;
// 縦軸線の終点
const yAxisLX = leftMargin + (gridSize * verticalGridNum);
const yAxisLY = originY;

// インフレ率の数値データ配列定数
const dataSet = [3.57,5.36,6.83,6.7,3.8,6.65,5.04,3.98,5.33,
   5.24,6.92,6.39,4.84,11.6,23.22,11.73,9.37,8.16,
   4.2,3.7,7.77,4.91,2.74,1.89,2.26,2.03,0.59,0.12,
   0.67,2.27,3.07,3.25,1.76,1.24,0.69,-0.12,0.13,
   1.74,0.66,-0.34,-0.67,-0.74,-0.92,-0.25,0,-0.28,
   0.24,0.06,1.38,-1.35,-0.71,-0.26,-0.05,0.34,2.76,
   0.78,-0.11,0.46,0.97,0.47,-0.01];

// データをプロットした座標を保管する配列定数
const plotXSet = [];
const plotYSet = [];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;各定数の意味は次のとおり。&lt;/p&gt;
&lt;div class=&quot;note&quot;&gt;
&lt;dl&gt;
&lt;dt&gt;topMargin&lt;/dt&gt;
&lt;dd&gt;方眼紙の上側の余白の広さ。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;leftMargin&lt;/dt&gt;
&lt;dd&gt;方眼紙の左側の余白の広さ。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;verticalGridNum&lt;/dt&gt;
&lt;dd&gt;方眼紙を構成する垂直の線の数。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;horizontalGridNum&lt;/dt&gt;
&lt;dd&gt;方眼紙を構成する水平の線の数。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;gridSize&lt;/dt&gt;
&lt;dd&gt;方眼紙を構成する格子状の線と線の間の広さ。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;originX&lt;/dt&gt;
&lt;dd&gt;グラフの座標系の原点を表すx座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;originY&lt;/dt&gt;
&lt;dd&gt;グラフの座標系の原点を表すy座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;xAxisSX&lt;/dt&gt;
&lt;dd&gt;グラフの座標系の横軸（x軸）の始点を表すx座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;xAxisSY&lt;/dt&gt;
&lt;dd&gt;グラフの座標系の横軸（x軸）の始点を表すy座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;xAxisLX&lt;/dt&gt;
&lt;dd&gt;グラフの座標系の横軸（x軸）の終点を表すx座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;xAxisLY&lt;/dt&gt;
&lt;dd&gt;グラフの座標系の横軸（x軸）の終点を表すy座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;yAxisSX&lt;/dt&gt;
&lt;dd&gt;グラフの座標系の縦軸（y軸）の始点を表すx座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;yAxisSY&lt;/dt&gt;
&lt;dd&gt;グラフの座標系の縦軸（y軸）の始点を表すy座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;yAxisLX&lt;/dt&gt;
&lt;dd&gt;グラフの座標系の縦軸（y軸）の終点を表すx座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;yAxisLY&lt;/dt&gt;
&lt;dd&gt;グラフの座標系の縦軸（y軸）の終点を表すy座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;dataSet&lt;/dt&gt;
&lt;dd&gt;インフレ率の各値が時系列に並んだ配列定数。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;plotXSet&lt;/dt&gt;
&lt;dd&gt;インフレ率の各値をプロットした位置のx座標を入れる配列定数。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;plotYSet&lt;/dt&gt;
&lt;dd&gt;インフレ率の各値をプロットした位置のy座標を入れる配列定数。&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;h4&gt;函数外の変数を宣言して値を代入&lt;/h4&gt;
&lt;p&gt;プログラムの実行途上で値が変化する場合はletキーワードを使って変数として宣言した。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;// 垂直方向の方眼線の始点
let verticalLineSX = leftMargin; // x座標
let verticalLineSY = topMargin; // y座標

// 垂直方向の方眼線の終点
let verticalLineLX = leftMargin; // x座標
let verticalLineLY = topMargin +
   (gridSize * horizontalGridNum); // y座標

// 水平方向の方眼線の始点
let horizontalLineSX = leftMargin; // x座標
let horizontalLineSY = topMargin; // y座標

// 水平方向の方眼線の終点
let horizontalLineLX = leftMargin +
   (gridSize * verticalGridNum); // x座標
let horizontalLineLY = topMargin; // y座標&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これらをconstキーワードで定義した場合、コンソール上にエラーが表示されてしまう。&lt;/p&gt;
&lt;p&gt;各変数の意味は次のとおり。&lt;/p&gt;
&lt;div class=&quot;note&quot;&gt;
&lt;dl&gt;
&lt;dt&gt;verticalLineSX&lt;/dt&gt;
&lt;dd&gt;垂直方向に伸びる方眼線の始点を表すx座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;verticalLineSY&lt;/dt&gt;
&lt;dd&gt;垂直方向に伸びる方眼線の始点を表すy座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;verticalLineLX&lt;/dt&gt;
&lt;dd&gt;垂直方向に伸びる方眼線の終点を表すx座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;verticalLineLY&lt;/dt&gt;
&lt;dd&gt;垂直方向に伸びる方眼線の終点を表すy座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;horizontalLineSX&lt;/dt&gt;
&lt;dd&gt;水平方向に伸びる方眼線の始点を表すx座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;horizontalLineSY&lt;/dt&gt;
&lt;dd&gt;水平方向に伸びる方眼線の始点を表すy座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;horizontalLineLX&lt;/dt&gt;
&lt;dd&gt;水平方向に伸びる方眼線の終点を表すx座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;horizontalLineLY&lt;/dt&gt;
&lt;dd&gt;水平方向に伸びる方眼線の終点を表すy座標。&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;h4&gt;canvasの背景色を描く函数&lt;/h4&gt;
&lt;p&gt;canvasの背景色を白にするための函数を定義した。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;/* Canvasの背景色を描画する函数 */
function drawBackgroundOfCanvas(canvasID) {
   const canvas = document.getElementById(canvasID);
   const ctx = canvas.getContext(&quot;2d&quot;);

   // canvasの背景色設定
   ctx.fillStyle = &quot;white&quot;; // 背景の色
   ctx.fillRect(0, 0, canvas.width, canvas.height); // 長方形
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;函数の定義は&lt;code&gt;function 函数名(引数){ステートメント1; ステートメント2}&lt;/code&gt;のような構成になる。&lt;/p&gt;
&lt;p&gt;この函数はHTMLのcanvas要素のid属性をその引数に受け取る。&lt;/p&gt;
&lt;p&gt;この函数ブロック内の始めの2行はHTML5 Canvasの2次元のAPIを利用するときにお馴染みのステートメント。getElementByIdメソッドで特定のid属性を持つcanvas要素を取得し、getContextメソッドで2次元のCanvas APIを利用できるようにするもの。&lt;/p&gt;
&lt;p&gt;いずれもconstキーワードを使ってオブジェクト定数のようなものにした。こうすることでctxという名前を与えたオブジェクトが提供するメソッドやプロパティを利用してcanvasに2次元の図を描けるようになった。&lt;/p&gt;
&lt;p&gt;fillStyleプロパティには塗りつぶすときの色を指定する。ここでは白色にした。&lt;/p&gt;
&lt;p&gt;fillRectメソッドは長方形の面を塗りつぶしてくれるもの。その引数には長方形の左上端と右下端の座標を指定する。canvasオブジェクトの座標系の原点となる0,0とcanvasオブジェクトの幅(width)と高さ(height)の座標を表すプロパティをここでは指定した。&lt;/p&gt;
&lt;br&gt;
&lt;h4&gt;方眼線を描く函数を定義&lt;/h4&gt;
&lt;p&gt;次に方眼線を描く函数を定義した。この函数が受け取る引数もHTMLのcanvas要素のid。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;/* 方眼紙を描く函数 */
function drawGraphPaper(canvasID) {
   const canvas = document.getElementById(canvasID);
   const ctx = canvas.getContext(&quot;2d&quot;);

   // 垂直方向の方眼線を描く
   for (let i = 0; i &amp;lt;= verticalGridNum; i++) {
      const remainder = i % 5; // 剰余計算
      if (remainder == 1) {
          // 方眼線のパスの初期化と線の属性
          ctx.beginPath(); // パスの初期化
          ctx.lineWidth = 1; // 方眼線の太さ
          ctx.strokeStyle = &quot;silver&quot;; // 方眼線の色
      } else {
          // 方眼線のパスの初期化と線の属性
          ctx.beginPath(); // パスの初期化
          ctx.lineWidth = 1; // 方眼線の太さ
          ctx.strokeStyle = &quot;lightgrey&quot;; // 方眼線の色
      }
      ctx.moveTo(verticalLineSX, verticalLineSY); // 方眼線の始点
      ctx.lineTo(verticalLineLX, verticalLineLY); // 方眼線の終点
      ctx.stroke(); // 方眼線の描画
      // 方眼線の幅だけ始点と終点を移動
      verticalLineSX = verticalLineSX + gridSize;
      verticalLineLX = verticalLineLX + gridSize;
   }
   // 水平方向の方眼線を描く
   for (let i = 0; i &amp;lt;= horizontalGridNum; i++) {
      const remainder = i % 2;
      if (remainder == 1) {
          // 方眼線のパスの初期化と線の属性
          ctx.beginPath(); // パスの初期化
          ctx.lineWidth = 1; // 方眼線の太さ
          ctx.strokeStyle = &quot;silver&quot;; // 方眼線の色
      } else {
          // 方眼線のパスの初期化と線の属性
          ctx.beginPath(); // パスの初期化
          ctx.lineWidth = 1; // 方眼線の太さ
          ctx.strokeStyle = &quot;lightgrey&quot;; // 方眼線の色
      }
      ctx.moveTo(horizontalLineSX, horizontalLineSY); // 方眼線の始点
      ctx.lineTo(horizontalLineLX, horizontalLineLY); // 方眼線の終点
      ctx.stroke(); // 描画
      // 方眼線の幅だけ始点と終点を移動
      horizontalLineSY = horizontalLineSY + gridSize;
      horizontalLineLY = horizontalLineLY + gridSize;
   }
   
   // 垂直方向の方眼線の始点
   verticalLineSX = leftMargin; // x座標
   verticalLineSY = topMargin; // y座標

   // 垂直方向の方眼線の終点
   verticalLineLX = leftMargin; // x座標
   verticalLineLY = topMargin +
      (gridSize * horizontalGridNum); // y座標

   // 水平方向の方眼線の始点
   horizontalLineSX = leftMargin; // x座標
   horizontalLineSY = topMargin; // y座標

   // 水平方向の方眼線の終点
   horizontalLineLX = leftMargin +
      (gridSize * verticalGridNum); // x座標
   horizontalLineLY = topMargin; // y座標
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;函数のブロック内の始めのコードはHTML5 Canvasの2次元用のAPIを利用するためのお決まりのステートメント2行。ちなみに1行で表す記法もある。&lt;/p&gt;
&lt;p&gt;垂直方向と水平方向の方眼線を1本ずつ描くためにそれぞれにfor文を使った。カウンター用の変数iが0からverticalGridNum（垂直方向の方眼線の総数）またはhorizontalGridNum（水平方向の方眼線の総数）に達するまで同じ処理を繰り返すようにした。&lt;/p&gt;
&lt;p&gt;方眼線の色を一定間隔で使い分けるためにfor文のブロック内に更にif文を設けて処理を分岐させた。分岐の条件は、垂直方向の方眼線を描くfor文では5で割った余りが1に等しいかそうでないか、水平方向の方眼線を描くfor文では2で割った余りが1に等しいかそうでないか。&lt;/p&gt;
&lt;p&gt;beginPathメソッドはパスの初期化のためのもの。パスとは線や面をどこにどのように描くかを決める属性値の総称のようなもの。lineWidthプロパティは線の太さ。strokeStyleプロパティは線の色を決める。&lt;/p&gt;
&lt;p&gt;moveToメソッドで線の始点となる座標を指定し、lineToメソッドで線の終点となる座標を指定し、strokeメソッドで線を描く。垂直方向の方眼線の始点と終点を決める各々の座標、水平方向の方眼線の始点と終点を決める各々の座標が入っている各変数を、これらのメソッドの引数として指定した。&lt;/p&gt;
&lt;p&gt;このようにして方眼線を描くコードが完成。&lt;/p&gt;
&lt;p&gt;最後に方眼線の座標を決める各変数の値を初期値に戻す必要があったので、for文のブロックから脱け出た後にそのためのコードが記述してある。&lt;/p&gt;
&lt;p&gt;ここまでのコードを仮に実行した場合の結果は次のとおり。&lt;/p&gt;
&lt;canvas id=&quot;JapanInflationRateTimeSeries2&quot; width=&quot;700&quot; height=&quot;400&quot;&gt;
このブラウザはHTML5 CanvasかJavaScriptをサポートしていません。
&lt;/canvas&gt;
&lt;p&gt;方眼線が微妙に色分けされていることが分かるはず。&lt;/p&gt;
&lt;br&gt;
&lt;h4&gt;座標系の横軸と縦軸を描く函数を定義&lt;/h4&gt;
&lt;p&gt;次の函数はグラフの座標系の原点を通る横軸（x軸）と縦軸（y軸）を描くためのもの。この函数もその引数にHTMLのcanvas要素のidを受け取る。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;/* 座標系の縦軸と横軸を描く函数 */
function drawAxis(canvasID) {
   const canvas = document.getElementById(canvasID);
   const ctx = canvas.getContext(&quot;2d&quot;);

   // パスの初期化と軸線の属性
   ctx.beginPath(); // パスの初期化
   ctx.lineWidth = 1; // 方眼線の太さ
   ctx.strokeStyle = &quot;black&quot;; // 方眼線の色

   // 横軸線と縦軸線のパス
   ctx.moveTo(xAxisSX, xAxisSY); // 横軸開始位置
   ctx.lineTo(xAxisLX, xAxisLY); // 横軸終了位置
   ctx.moveTo(yAxisSX, yAxisSY); // 縦軸開始位置
   ctx.lineTo(yAxisLX, yAxisLY); // 縦軸終了位置
   ctx.stroke(); // 縦軸線と横軸線の描画
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;moveToメソッドとlineToメソッドの引数には、縦軸と横軸の各々の始点と終点を表す座標が定義されている定数を指定した。&lt;/p&gt;
&lt;p&gt;ここまでのコードを仮に実行した場合の結果は次のとおり。&lt;/p&gt;
&lt;canvas id=&quot;JapanInflationRateTimeSeries3&quot; width=&quot;700&quot; height=&quot;400&quot;&gt;
このブラウザはHTML5 CanvasかJavaScriptをサポートしていません。
&lt;/canvas&gt;
&lt;br&gt;
&lt;h4&gt;座標系の横軸と縦軸の目盛りを割り振る函数を定義&lt;/h4&gt;
&lt;p&gt;座標系の横軸と縦軸に方眼線と一致するように目盛りを割り振る函数が次のコード。この函数もHTMLのcanvas要素のidをその引数として受け取る。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;/* 横軸と縦軸の目盛項目を書き込む函数 */
function drawScaleItems(canvasID) {
   const canvas = document.getElementById(canvasID);
   const ctx = canvas.getContext(&quot;2d&quot;);

   // 横軸線の項目（年）が入った配列データの作成
   const scaleX = []; // 定数を配列として定義
   let year = 1960; // 開始年を格納
   const finalCount = 2020 - 1960; // 回数の計算
   for (let i = 0; i &amp;lt;= finalCount; i++) {
      scaleX[i] = year; // 1960から順に配列に格納
      year = year + 1; // 変数yearに1を加える
   }

   // 横軸線の項目を描画する
   ctx.font = &quot;12px sans-serif&quot;; // フォント
   ctx.textBaseline = &quot;middle&quot;; // 文字の垂直位置
   ctx.fillStyle = &quot;black&quot;; // 文字の色
   ctx.direction = &quot;ltr&quot;; // 文字列の向き
   ctx.textAlign = &quot;center&quot;; // 文字の水平位置
   for (let i = 0; i &amp;lt; scaleX.length; i++) {
      // 変数iに1を加えることでx軸を1升右へ移動
      let x = leftMargin + (gridSize * (i + 1));
      let y = verticalLineLY + 10;
      ctx.fillText(scaleX[i], x, y); // 文字列の描画
      i = i + 4; // 配列番号を4つずつ跳ばして描くため
   }

   // 座標系の原点から上方向への方眼線数
   const positiveScaleCount = (originY - topMargin) / gridSize;
   // 座標系の原点から下方向への方眼線数
   const negativeScaleCount = horizontalGridNum - positiveScaleCount;

   // 縦軸線の項目を描画する
   ctx.textAlign = &quot;right&quot;; // 文字の水平位置
   for (let i = 0; i &amp;lt; positiveScaleCount; i++) {
      const x = originX - 5;
      const y = originY - (gridSize * i);
      ctx.fillText(i, x, y); // 正数の描画
      i = i + 1; // 偶数だけ描画するため
   }
   for (let i = 2; i &amp;lt; negativeScaleCount; i++) {
      const x = originX - 5;
      const y = originY + (gridSize * i);
      ctx.fillText(-1 * i, x, y); // 負数の描画
      i = i + 1; // 偶数だけ描画するため
   }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このコードで使った配列、定数、変数は次のとおり。&lt;/p&gt;
&lt;div class=&quot;note&quot;&gt;
&lt;dl&gt;
&lt;dt&gt;scaleX[]&lt;/dt&gt;
&lt;dd&gt;年を順番に保存しておく配列定数。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;year&lt;/dt&gt;
&lt;dd&gt;年を保存しておく変数。初期値として1960を代入。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;finalCount&lt;/dt&gt;
&lt;dd&gt;1960から2020までを配列に入れるために処理を何回繰り返す必要があるかを計算してその結果を入れる定数。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;positiveScaleCount&lt;/dt&gt;
&lt;dd&gt;縦軸の正の目盛り（方眼紙の升目）がいくつあるかを計算して入れておく定数。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;negativeScaleCount&lt;/dt&gt;
&lt;dd&gt;縦軸の負の目盛り（方眼紙の升目）がいくつあるかを計算して入れておく定数。&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;p&gt;この折れ線グラフではその横軸の目盛りとして1960から2020までの年単位を時系列として取るので、この函数ブロック内の最初のfor文で1960から2020までの数を生成して配列定数として定義した。&lt;/p&gt;
&lt;p&gt;そして文字に関する様々なプロパティに値を代入して文字の属性を指定しているのがその次のコード。&lt;/p&gt;
&lt;p&gt;fontプロパティにはフォントの属性を指定する。12pxはフォントのサイズが12ピクセルということ。sans-serifはフォント・ファミリー名。&lt;/p&gt;
&lt;p&gt;textBaselineプロパティは文字列の垂直方向の配置。ここでは中間(middle)とした。fillStyleプロパティは文字を塗りつぶす色。directionプロパティは文字列の向き。ここでは左から右へ書くことを表すltrと指定した。rtlと指定すれば右から左へ書くことを意味する。textAlignプロパティは水平方向の文字列の配置。ここでは中央(center)とした。&lt;/p&gt;
&lt;p&gt;for文とfillTextメソッドを使って文字列を描画するコードがそれに続く。&lt;/p&gt;
&lt;p&gt;for文の引数にあるscaleX.lengthはscaleXという配列の要素数を知ることができるプロパティ。ここでは配列の長さと同じ値になるまでfor文を繰り返すための条件式（比較演算）にこのプロパティを用いた。&lt;/p&gt;
&lt;p&gt;positiveScaleCountとnegativeScaleCountという変数には正の目盛りの数と負の目盛りの数を計算して定義した。これらの定数を条件にして正方向（上方向）と負方向（下方向）の目盛りをfor文を用いてそれぞれ描くコードがこの函数の後半部分。&lt;/p&gt;
&lt;p&gt;縦軸（y軸）の目盛りは、textAlignプロパティをrightに設定して文字列を右揃えにした。そして方眼紙の色分けに合わせて偶数だけを表示させるようにした。&lt;/p&gt;
&lt;p&gt;ここまでのコードを仮に実行した場合の結果が次のとおり。&lt;/p&gt;
&lt;canvas id=&quot;JapanInflationRateTimeSeries4&quot; width=&quot;700&quot; height=&quot;400&quot;&gt;
このブラウザはHTML5 CanvasかJavaScriptをサポートしていません。
&lt;/canvas&gt;
&lt;p&gt;方眼線の色分けと目盛りの文字の位置が一致するように配置できているはず。&lt;/p&gt;
&lt;br&gt;
&lt;h4&gt;グラフの表題を書き込む函数を定義&lt;/h4&gt;
&lt;p&gt;次の函数はグラフの上に表題、グラフの下に参照元や説明のための文字列を書き込むもの。この函数もその引数にHTMLのcanvas要素のidを受け取る。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;/* グラフに文字列を書き込む函数 */
function writeString(canvasID) {
   const canvas = document.getElementById(canvasID);
   const ctx = canvas.getContext(&quot;2d&quot;);

   // グラフの表題
   ctx.font = &quot;bold 15px sans-serif&quot;; // フォント
   ctx.textAlign = &quot;start&quot;; // 文字の水平位置
   ctx.textBaseline = &quot;middle&quot;; // 文字の垂直位置
   ctx.fillStyle = &quot;black&quot;; // 文字の色
   ctx.direction = &quot;ltr&quot;; // 文字列の向き
   ctx.fillText(&quot;図1 日本のインフレ率の時系列 1960-2020 (横軸 : 年, 縦軸 : %)&quot;,
      leftMargin + 0, verticalLineSY - 15); // 文字列の描画

   // グラフの参照元を記す文字列
   ctx.font = &quot;italic 12px sans-serif&quot;; // フォント
   ctx.fillText(&quot;参照元 : &quot;,
      leftMargin + 0, verticalLineLY + 40); // 文字列の描画
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;fontプロパティのboldは太字、italicはイタリック体。textAlignプロパティのstartは書き始めの位置へ文字列を寄せること。&lt;/p&gt;
&lt;p&gt;fillTextメソッドの引数は左から、表示する文字列、x座標、y座標、文字列表示の最大許容幅。最後の引数は省略可能なのでこのコードでは省略してある。&lt;/p&gt;
&lt;p&gt;ここまでのコードを仮に実行したとすると次のようになるはず。&lt;/p&gt;
&lt;canvas id=&quot;JapanInflationRateTimeSeries5&quot; width=&quot;700&quot; height=&quot;400&quot;&gt;
このブラウザはHTML5 CanvasかJavaScriptをサポートしていません。
&lt;/canvas&gt;
&lt;br&gt;
&lt;h4&gt;データを座標系にプロットする函数を定義&lt;/h4&gt;
&lt;p&gt;次のコードはインフレ率の数値データを座標系にプロットする函数。この函数もHTMLのcanvas要素のidをその引数に取る。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;/* データを座標系にプロットする函数 */
function plotData(canvasID) {
   const canvas = document.getElementById(canvasID);
   const ctx = canvas.getContext(&quot;2d&quot;);

   // インフレ率のデータを座標上にプロットする
   for (let i = 0; i &amp;lt; dataSet.length; i++) {
      // プロットする位置を示す座標を入れる変数
      let plotX;
      let plotY;
      plotX = originX + (gridSize * (i + 1));
      // Canvasの座標系はy軸が逆向きなので-1を掛けて正負を反転
      plotY = originY + (-1 * gridSize * dataSet[i]);

      // プロットしたデータの座標を配列定数に記録
      plotXSet[i] = plotX;
      plotYSet[i] = plotY;

      // パスの設定と描画
      ctx.beginPath(); // パスを初期化    
      ctx.arc(plotX, plotY, 1.5,
         (Math.PI/180)*0, (Math.PI/180)*360); // 円のパス
      ctx.closePath(); // パスを閉じる
      ctx.fillStyle = &quot;blue&quot;; // 点の色
      ctx.fill(); // 点を塗りつぶす
   }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配列定数にしたインフレ率のデータを順番に取り出して座標系にプロットするためにfor文を用いた。&lt;/p&gt;
&lt;p&gt;for文のブロック中では、x座標とy座標を計算して入れる変数plotXとplotYを設けた。y座標はHTML5 Canvasの座標系とこのグラフで用いる座標系では逆向きになるため、-1を掛けて符号を反転させることでその問題に対処した。&lt;/p&gt;
&lt;p&gt;函数の外であらかじめ宣言しておいた配列定数であるplotXSetとplotYSetに、プロットした各点の座標を順番に入れて保存した。この配列定数は函数外で定義しておいたグローバル定数なので、折線グラフを描くために定義したこの次の函数で利用することができる。&lt;/p&gt;
&lt;p&gt;beginPathメソッドでパスを初期化し、arcメソッドでしかるべき座標に点を描画する指示をしてfillメソッドで塗りつぶすようにした。&lt;/p&gt;
&lt;p&gt;closePathメソッドはパスを閉じるためのもの。円弧を描くarcメソッドを用いて円を描くので円弧を閉じる必要があり、そのためにarcメソッドの後にclosePathメソッドを用いた。&lt;/p&gt;
&lt;p&gt;インフレ率のデータをプロットした結果は次のようになるはず。&lt;/p&gt;
&lt;canvas id=&quot;JapanInflationRateTimeSeries6&quot; width=&quot;700&quot; height=&quot;400&quot;&gt;
このブラウザはHTML5 CanvasかJavaScriptをサポートしていません。
&lt;/canvas&gt;
&lt;br&gt;
&lt;h4&gt;プロットした点を繋いで折線グラフを描く函数を定義&lt;/h4&gt;
&lt;p&gt;インフレ率のデータをプロットした点を線で結び折線グラフを作る函数のコードは次のとおり。この函数もHTMLのcanvas要素のidをその引数に取る。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;/* 折線グラフを描く函数 */
function drawLineGraph(canvasID) {
   const canvas = document.getElementById(canvasID);
   const ctx = canvas.getContext(&quot;2d&quot;);

   // プロットした点を折線で結ぶ
   for (let i = 0; i &amp;lt; plotXSet.length; i++) {
      ctx.beginPath(); // パスを初期化
      ctx.moveTo(plotXSet[i], plotYSet[i]); // 折線の始点
      ctx.lineTo(plotXSet[i + 1], plotYSet[i + 1]); // 折線の終点
      ctx.strokeStyle = &quot;red&quot;; // 折線の色
      ctx.stroke(); // 折線の描画
   }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;プロットした各点の座標を保存しておいたplotXSetとplotYSetという配列を利用し、for文の中でmoveToメソッドとlineToメソッドとstrokeメソッドを使って各点を繋ぐと折れ線グラフが完成する。&lt;/p&gt;
&lt;p&gt;for文では配列定数の要素数を示すlengthプロパティをその条件式の比較演算で用いた。&lt;/p&gt;
&lt;p&gt;strokeStyleプロパティに赤色を指定することで折れ線の色を赤にした。&lt;/p&gt;
&lt;p&gt;ここまでのコードを仮に実行した場合の結果は次のとおり。&lt;/p&gt;
&lt;canvas id=&quot;JapanInflationRateTimeSeries7&quot; width=&quot;700&quot; height=&quot;400&quot;&gt;
このブラウザはHTML5 CanvasかJavaScriptをサポートしていません。
&lt;/canvas&gt;
&lt;br&gt;
&lt;h4&gt;函数を呼び出すステートメント&lt;/h4&gt;
&lt;p&gt;これまでは各々の函数の定義をしただけなのでそれを呼び出して実行するコードが必要。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;// 各函数を呼び出す
let canvasID = &quot;JapanInflationRateTimeSeries&quot;;

// 各函数を呼び出す
drawBackgroundOfCanvas(canvasID)
drawGraphPaper(canvasID);
drawAxis(canvasID);
drawScaleItems(canvasID);
writeString(canvasID);
plotData(canvasID);
drawLineGraph(canvasID);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;函数を呼び出すステートメントを記述した順番に各函数は実行される。&lt;/p&gt;
&lt;br&gt;
&lt;h4&gt;スクリプト全体を匿名函数で袋とじ&lt;/h4&gt;
&lt;p&gt;これまでのコードを全てまとめると次のようになる。その際、このスクリプト全体を匿名函数によって袋とじにした。こうしておけばこのスクリプトの影響が外部に副作用として及ばないはず。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
// このスクリプト全体を匿名函数で袋とじ
(function() {

   // 方眼紙の属性定数
   const topMargin = 35; // 上余白
   const leftMargin = 30; // 左余白
   const verticalGridNum = 65; // 方眼紙の垂直線数
   const horizontalGridNum = 30; // 方眼紙の水平線数
   const gridSize = 10; // 方眼紙の線間の幅
   
   // 座標系の原点位置を決める定数
   const originX = leftMargin + (gridSize * 0); // x座標
   const originY = topMargin + (gridSize * 25); // y座標
   
   // 横軸線の始点
   const xAxisSX = originX;
   const xAxisSY = topMargin;
   // 横軸線の終点
   const xAxisLX = originX;
   const xAxisLY = topMargin + (gridSize * horizontalGridNum);
   
   // 縦軸線の始点
   const yAxisSX = leftMargin;
   const yAxisSY = originY;
   // 縦軸線の終点
   const yAxisLX = leftMargin + (gridSize * verticalGridNum);
   const yAxisLY = originY;
   
   // インフレ率の数値データ配列定数
   const dataSet = [3.57,5.36,6.83,6.7,3.8,6.65,5.04,3.98,5.33,
      5.24,6.92,6.39,4.84,11.6,23.22,11.73,9.37,8.16,
      4.2,3.7,7.77,4.91,2.74,1.89,2.26,2.03,0.59,0.12,
      0.67,2.27,3.07,3.25,1.76,1.24,0.69,-0.12,0.13,
      1.74,0.66,-0.34,-0.67,-0.74,-0.92,-0.25,0,-0.28,
      0.24,0.06,1.38,-1.35,-0.71,-0.26,-0.05,0.34,2.76,
      0.78,-0.11,0.46,0.97,0.47,-0.01];

   // データをプロットした座標を保管する配列定数
   const plotXSet = [];
   const plotYSet = [];
   
   // 垂直方向の方眼線の始点
   let verticalLineSX = leftMargin; // x座標
   let verticalLineSY = topMargin; // y座標
   
   // 垂直方向の方眼線の終点
   let verticalLineLX = leftMargin; // x座標
   let verticalLineLY = topMargin +
      (gridSize * horizontalGridNum); // y座標
   
   // 水平方向の方眼線の始点
   let horizontalLineSX = leftMargin; // x座標
   let horizontalLineSY = topMargin; // y座標
   
   // 水平方向の方眼線の終点
   let horizontalLineLX = leftMargin +
      (gridSize * verticalGridNum); // x座標
   let horizontalLineLY = topMargin; // y座標

   /* Canvasの背景色を描画する函数 */
   function drawBackgroundOfCanvas(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);

      // canvasの背景色設定
      ctx.fillStyle = &quot;white&quot;; // 背景の色
      ctx.fillRect(0, 0, canvas.width, canvas.height); // 長方形
   }
   
   /* 方眼紙を描く函数 */
   function drawGraphPaper(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // 垂直方向の方眼線を描く
      for (let i = 0; i &amp;lt;= verticalGridNum; i++) {
         const remainder = i % 5; // 剰余計算
         if (remainder == 1) {
             // 方眼線のパスの初期化と線の属性
             ctx.beginPath(); // パスの初期化
             ctx.lineWidth = 1; // 方眼線の太さ
             ctx.strokeStyle = &quot;silver&quot;; // 方眼線の色
         } else {
             // 方眼線のパスの初期化と線の属性
             ctx.beginPath(); // パスの初期化
             ctx.lineWidth = 1; // 方眼線の太さ
             ctx.strokeStyle = &quot;lightgrey&quot;; // 方眼線の色
         }
         ctx.moveTo(verticalLineSX, verticalLineSY); // 方眼線の始点
         ctx.lineTo(verticalLineLX, verticalLineLY); // 方眼線の終点
         ctx.stroke(); // 方眼線の描画
         // 方眼線の幅だけ始点と終点を移動
         verticalLineSX = verticalLineSX + gridSize;
         verticalLineLX = verticalLineLX + gridSize;
      }
      // 水平方向の方眼線を描く
      for (let i = 0; i &amp;lt;= horizontalGridNum; i++) {
         const remainder = i % 2;
         if (remainder == 1) {
             // 方眼線のパスの初期化と線の属性
             ctx.beginPath(); // パスの初期化
             ctx.lineWidth = 1; // 方眼線の太さ
             ctx.strokeStyle = &quot;silver&quot;; // 方眼線の色
         } else {
             // 方眼線のパスの初期化と線の属性
             ctx.beginPath(); // パスの初期化
             ctx.lineWidth = 1; // 方眼線の太さ
             ctx.strokeStyle = &quot;lightgrey&quot;; // 方眼線の色
         }
         ctx.moveTo(horizontalLineSX, horizontalLineSY); // 方眼線の始点
         ctx.lineTo(horizontalLineLX, horizontalLineLY); // 方眼線の終点
         ctx.stroke(); // 描画
         // 方眼線の幅だけ始点と終点を移動
         horizontalLineSY = horizontalLineSY + gridSize;
         horizontalLineLY = horizontalLineLY + gridSize;
      }
      
      // 垂直方向の方眼線の始点
      verticalLineSX = leftMargin; // x座標
      verticalLineSY = topMargin; // y座標
   
      // 垂直方向の方眼線の終点
      verticalLineLX = leftMargin; // x座標
      verticalLineLY = topMargin +
         (gridSize * horizontalGridNum); // y座標
   
      // 水平方向の方眼線の始点
      horizontalLineSX = leftMargin; // x座標
      horizontalLineSY = topMargin; // y座標
   
      // 水平方向の方眼線の終点
      horizontalLineLX = leftMargin +
         (gridSize * verticalGridNum); // x座標
      horizontalLineLY = topMargin; // y座標
   }
   
   /* 座標系の縦軸と横軸を描く函数 */
   function drawAxis(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // パスの初期化と軸線の属性
      ctx.beginPath(); // パスの初期化
      ctx.lineWidth = 1; // 方眼線の太さ
      ctx.strokeStyle = &quot;black&quot;; // 方眼線の色
   
      // 横軸線と縦軸線のパス
      ctx.moveTo(xAxisSX, xAxisSY); // 横軸開始位置
      ctx.lineTo(xAxisLX, xAxisLY); // 横軸終了位置
      ctx.moveTo(yAxisSX, yAxisSY); // 縦軸開始位置
      ctx.lineTo(yAxisLX, yAxisLY); // 縦軸終了位置
      ctx.stroke(); // 縦軸線と横軸線の描画
   }
   
   /* x軸とy軸の目盛項目を書き込む函数 */
   function drawScaleItems(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // 横軸線の項目（年）が入った配列データの作成
      const scaleX = []; // 定数を配列として定義
      let year = 1960; // 開始年を格納
      const finalCount = 2020 - 1960; // 回数の計算
      for (let i = 0; i &amp;lt;= finalCount; i++) {
         scaleX[i] = year; // 1960から順に配列に格納
         year = year + 1; // 変数yearに1を加える
      }
   
      // 横軸線の項目を描画する
      ctx.font = &quot;12px sans-serif&quot;; // フォント
      ctx.textBaseline = &quot;middle&quot;; // 文字の垂直位置
      ctx.fillStyle = &quot;black&quot;; // 文字の色
      ctx.direction = &quot;ltr&quot;; // 文字列の向き
      ctx.textAlign = &quot;center&quot;; // 文字の水平位置
      for (let i = 0; i &amp;lt; scaleX.length; i++) {
         // 変数iに1を加えることでx軸を1升右へ移動
         let x = leftMargin + (gridSize * (i + 1));
         let y = verticalLineLY + 10;
         ctx.fillText(scaleX[i], x, y); // 文字列の描画
         i = i + 4; // 配列番号を4つずつ跳ばして描くため
      }
   
      // 座標系の原点から上方向への方眼線数
      const positiveScaleCount = (originY - topMargin) / gridSize;
      // 座標系の原点から下方向への方眼線数
      const negativeScaleCount = horizontalGridNum - positiveScaleCount;
   
      // 縦軸線の項目を描画する
      ctx.textAlign = &quot;right&quot;; // 文字の水平位置
      for (let i = 0; i &amp;lt; positiveScaleCount; i++) {
         const x = originX - 5;
         const y = originY - (gridSize * i);
         ctx.fillText(i, x, y); // 正数の描画
         i = i + 1; // 偶数だけ描画するため
      }
      for (let i = 2; i &amp;lt; negativeScaleCount; i++) {
         const x = originX - 5;
         const y = originY + (gridSize * i);
         ctx.fillText(-1 * i, x, y); // 負数の描画
         i = i + 1; // 偶数だけ描画するため
      }
   }
   
   /* グラフに文字列を書き込む函数 */
   function writeString(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // グラフの表題
      ctx.font = &quot;bold 15px sans-serif&quot;; // フォント
      ctx.textAlign = &quot;start&quot;; // 文字の水平位置
      ctx.textBaseline = &quot;middle&quot;; // 文字の垂直位置
      ctx.fillStyle = &quot;black&quot;; // 文字の色
      ctx.direction = &quot;ltr&quot;; // 文字列の向き
      ctx.fillText(&quot;図1 日本のインフレ率の時系列 1960-2020 (横軸 : 年, 縦軸 : %)&quot;,
         leftMargin + 0, verticalLineSY - 15); // 文字列の描画
   
      // グラフの参照元を記す文字列
      ctx.font = &quot;italic 12px sans-serif&quot;; // フォント
      ctx.fillText(&quot;参照元：&quot;,
         leftMargin + 0, verticalLineLY + 40); // 文字列の描画
   }
   
   /* データを座標系に描画する函数 */
   function plotData(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // インフレ率のデータを座標上にプロットする
      for (let i = 0; i &amp;lt; dataSet.length; i++) {
         // プロットする位置を示す座標を入れる変数
         let plotX = originX + (gridSize * (i + 1));
         // Canvasの座標系はy軸が逆向きなので-1を掛けて正負を反転
         let plotY = originY + (-1 * gridSize * dataSet[i]);
   
         // プロットしたデータの座標を配列定数に記録
         plotXSet[i] = plotX;
         plotYSet[i] = plotY;
   
         // パスの設定と描画
         ctx.beginPath(); // パスを初期化    
         ctx.arc(plotX, plotY, 1.5,
            (Math.PI/180)*0, (Math.PI/180)*360); // 円のパス
         ctx.closePath(); // パスを閉じる
         ctx.fillStyle = &quot;blue&quot;; // 点の色
         ctx.fill(); // 点を塗りつぶす
      }
   }
   
   /* 折線グラフを描く函数 */
   function drawLineGraph(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // プロットした点を折線で結ぶ
      for (let i = 0; i &amp;lt; plotXSet.length; i++) {
         ctx.beginPath(); // パスを初期化
         ctx.moveTo(plotXSet[i], plotYSet[i]); // 折線の始点
         ctx.lineTo(plotXSet[i + 1], plotYSet[i + 1]); // 折線の終点
         ctx.strokeStyle = &quot;red&quot;; // 折線の色
         ctx.stroke(); // 折線の描画
      }
   }

   // 各函数を呼び出す
   let canvasID = &quot;JapanInflationRateTimeSeries&quot;;

   drawBackgroundOfCanvas(canvasID)
   drawGraphPaper(canvasID);
   drawAxis(canvasID);
   drawScaleItems(canvasID);
   writeString(canvasID);
   plotData(canvasID);
   drawLineGraph(canvasID);

})(); // 袋とじ用の匿名函数の終わり
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;このスクリプトには異なるデータセットに対応できるような汎用性や拡張性がまだ考慮されていない。少しずつ改良して汎用性のあるものにしていきたい。例えばJSON形式のデータを受け取ってそれを折線グラフに表現するように最終的にはしたい。&lt;/p&gt;
&lt;p&gt;データの視覚化を行うJavaScriptのライブラリはすでに数多くあるので、そちらを利用する方法についてはまたの機会に。&lt;/p&gt;
&lt;script&gt;
// このスクリプト全体を匿名函数で袋とじ
(function() {

   // 方眼紙の属性定数
   const topMargin = 35; // 上余白
   const leftMargin = 30; // 左余白
   const verticalGridNum = 65; // 方眼紙の垂直線数
   const horizontalGridNum = 30; // 方眼紙の水平線数
   const gridSize = 10; // 方眼紙の線間の幅
   
   // 座標系の原点位置を決める定数
   const originX = leftMargin + (gridSize * 0); // x座標
   const originY = topMargin + (gridSize * 25); // y座標
   
   // 横軸線の始点
   const xAxisSX = originX;
   const xAxisSY = topMargin;
   // 横軸線の終点
   const xAxisLX = originX;
   const xAxisLY = topMargin + (gridSize * horizontalGridNum);
   
   // 縦軸線の始点
   const yAxisSX = leftMargin;
   const yAxisSY = originY;
   // 縦軸線の終点
   const yAxisLX = leftMargin + (gridSize * verticalGridNum);
   const yAxisLY = originY;
   
   // インフレ率の数値データ配列定数
   const dataSet = [3.57,5.36,6.83,6.7,3.8,6.65,5.04,3.98,5.33,
      5.24,6.92,6.39,4.84,11.6,23.22,11.73,9.37,8.16,
      4.2,3.7,7.77,4.91,2.74,1.89,2.26,2.03,0.59,0.12,
      0.67,2.27,3.07,3.25,1.76,1.24,0.69,-0.12,0.13,
      1.74,0.66,-0.34,-0.67,-0.74,-0.92,-0.25,0,-0.28,
      0.24,0.06,1.38,-1.35,-0.71,-0.26,-0.05,0.34,2.76,
      0.78,-0.11,0.46,0.97,0.47,-0.01];

   // データをプロットした座標を保管する配列定数
   const plotXSet = [];
   const plotYSet = [];
   
   // 垂直方向の方眼線の始点
   let verticalLineSX = leftMargin; // x座標
   let verticalLineSY = topMargin; // y座標
   
   // 垂直方向の方眼線の終点
   let verticalLineLX = leftMargin; // x座標
   let verticalLineLY = topMargin +
      (gridSize * horizontalGridNum); // y座標
   
   // 水平方向の方眼線の始点
   let horizontalLineSX = leftMargin; // x座標
   let horizontalLineSY = topMargin; // y座標
   
   // 水平方向の方眼線の終点
   let horizontalLineLX = leftMargin +
      (gridSize * verticalGridNum); // x座標
   let horizontalLineLY = topMargin; // y座標

   /* Canvasの背景色を描画する函数 */
   function drawBackgroundOfCanvas(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);

      // canvasの背景色設定
      ctx.fillStyle = &quot;white&quot;; // 背景の色
      ctx.fillRect(0, 0, canvas.width, canvas.height); // 長方形
   }
   
   /* 方眼紙を描く函数 */
   function drawGraphPaper(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // 垂直方向の方眼線を描く
      for (let i = 0; i &lt;= verticalGridNum; i++) {
         const remainder = i % 5; // 剰余計算
         if (remainder == 1) {
             // 方眼線のパスの初期化と線の属性
             ctx.beginPath(); // パスの初期化
             ctx.lineWidth = 1; // 方眼線の太さ
             ctx.strokeStyle = &quot;silver&quot;; // 方眼線の色
         } else {
             // 方眼線のパスの初期化と線の属性
             ctx.beginPath(); // パスの初期化
             ctx.lineWidth = 1; // 方眼線の太さ
             ctx.strokeStyle = &quot;lightgrey&quot;; // 方眼線の色
         }
         ctx.moveTo(verticalLineSX, verticalLineSY); // 方眼線の始点
         ctx.lineTo(verticalLineLX, verticalLineLY); // 方眼線の終点
         ctx.stroke(); // 方眼線の描画
         // 方眼線の幅だけ始点と終点を移動
         verticalLineSX = verticalLineSX + gridSize;
         verticalLineLX = verticalLineLX + gridSize;
      }
      // 水平方向の方眼線を描く
      for (let i = 0; i &lt;= horizontalGridNum; i++) {
         const remainder = i % 2;
         if (remainder == 1) {
             // 方眼線のパスの初期化と線の属性
             ctx.beginPath(); // パスの初期化
             ctx.lineWidth = 1; // 方眼線の太さ
             ctx.strokeStyle = &quot;silver&quot;; // 方眼線の色
         } else {
             // 方眼線のパスの初期化と線の属性
             ctx.beginPath(); // パスの初期化
             ctx.lineWidth = 1; // 方眼線の太さ
             ctx.strokeStyle = &quot;lightgrey&quot;; // 方眼線の色
         }
         ctx.moveTo(horizontalLineSX, horizontalLineSY); // 方眼線の始点
         ctx.lineTo(horizontalLineLX, horizontalLineLY); // 方眼線の終点
         ctx.stroke(); // 描画
         // 方眼線の幅だけ始点と終点を移動
         horizontalLineSY = horizontalLineSY + gridSize;
         horizontalLineLY = horizontalLineLY + gridSize;
      }
      
      // 垂直方向の方眼線の始点
      verticalLineSX = leftMargin; // x座標
      verticalLineSY = topMargin; // y座標
   
      // 垂直方向の方眼線の終点
      verticalLineLX = leftMargin; // x座標
      verticalLineLY = topMargin +
         (gridSize * horizontalGridNum); // y座標
   
      // 水平方向の方眼線の始点
      horizontalLineSX = leftMargin; // x座標
      horizontalLineSY = topMargin; // y座標
   
      // 水平方向の方眼線の終点
      horizontalLineLX = leftMargin +
         (gridSize * verticalGridNum); // x座標
      horizontalLineLY = topMargin; // y座標
   }
   
   /* 座標系の縦軸と横軸を描く函数 */
   function drawAxis(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // パスの初期化と軸線の属性
      ctx.beginPath(); // パスの初期化
      ctx.lineWidth = 1; // 方眼線の太さ
      ctx.strokeStyle = &quot;black&quot;; // 方眼線の色
   
      // 横軸線と縦軸線のパス
      ctx.moveTo(xAxisSX, xAxisSY); // 横軸開始位置
      ctx.lineTo(xAxisLX, xAxisLY); // 横軸終了位置
      ctx.moveTo(yAxisSX, yAxisSY); // 縦軸開始位置
      ctx.lineTo(yAxisLX, yAxisLY); // 縦軸終了位置
      ctx.stroke(); // 縦軸線と横軸線の描画
   }
   
   /* x軸とy軸の目盛項目を書き込む函数 */
   function drawScaleItems(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // 横軸線の項目（年）が入った配列データの作成
      const scaleX = []; // 定数を配列として定義
      let year = 1960; // 開始年を格納
      const finalCount = 2020 - 1960; // 回数の計算
      for (let i = 0; i &lt;= finalCount; i++) {
         scaleX[i] = year; // 1960から順に配列に格納
         year = year + 1; // 変数yearに1を加える
      }
   
      // 横軸線の項目を描画する
      ctx.font = &quot;12px sans-serif&quot;; // フォント
      ctx.textBaseline = &quot;middle&quot;; // 文字の垂直位置
      ctx.fillStyle = &quot;black&quot;; // 文字の色
      ctx.direction = &quot;ltr&quot;; // 文字列の向き
      ctx.textAlign = &quot;center&quot;; // 文字の水平位置
      for (let i = 0; i &lt; scaleX.length; i++) {
         // 変数iに1を加えることでx軸を1升右へ移動
         let x = leftMargin + (gridSize * (i + 1));
         let y = verticalLineLY + 10;
         ctx.fillText(scaleX[i], x, y); // 文字列の描画
         i = i + 4; // 配列番号を4つずつ跳ばして描くため
      }
   
      // 座標系の原点から上方向への方眼線数
      const positiveScaleCount = (originY - topMargin) / gridSize;
      // 座標系の原点から下方向への方眼線数
      const negativeScaleCount = horizontalGridNum - positiveScaleCount;
   
      // 縦軸線の項目を描画する
      ctx.textAlign = &quot;right&quot;; // 文字の水平位置
      for (let i = 0; i &lt; positiveScaleCount; i++) {
         const x = originX - 5;
         const y = originY - (gridSize * i);
         ctx.fillText(i, x, y); // 正数の描画
         i = i + 1; // 偶数だけ描画するため
      }
      for (let i = 2; i &lt; negativeScaleCount; i++) {
         const x = originX - 5;
         const y = originY + (gridSize * i);
         ctx.fillText(-1 * i, x, y); // 負数の描画
         i = i + 1; // 偶数だけ描画するため
      }
   }
   
   /* グラフに文字列を書き込む函数 */
   function writeString(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // グラフの表題
      ctx.font = &quot;bold 15px sans-serif&quot;; // フォント
      ctx.textAlign = &quot;start&quot;; // 文字の水平位置
      ctx.textBaseline = &quot;middle&quot;; // 文字の垂直位置
      ctx.fillStyle = &quot;black&quot;; // 文字の色
      ctx.direction = &quot;ltr&quot;; // 文字列の向き
      ctx.fillText(&quot;図1 日本のインフレ率の時系列 1960-2020 (横軸 : 年, 縦軸 : %)&quot;,
         leftMargin + 0, verticalLineSY - 15); // 文字列の描画
   
      // グラフの参照元を記す文字列
      ctx.font = &quot;italic 12px sans-serif&quot;; // フォント
      ctx.fillText(&quot;参照元 : &quot;,
         leftMargin + 0, verticalLineLY + 40); // 文字列の描画
   }
   
   /* データを座標系に描画する函数 */
   function plotData(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // インフレ率のデータを座標上にプロットする
      for (let i = 0; i &lt; dataSet.length; i++) {
         // プロットする位置を示す座標を入れる変数
         let plotX = originX + (gridSize * (i + 1));
         // Canvasの座標系はy軸が逆向きなので-1を掛けて正負を反転
         let plotY = originY + (-1 * gridSize * dataSet[i]);
   
         // プロットしたデータの座標を配列定数に記録
         plotXSet[i] = plotX;
         plotYSet[i] = plotY;
   
         // パスの設定と描画
         ctx.beginPath(); // パスを初期化    
         ctx.arc(plotX, plotY, 1.5,
            (Math.PI/180)*0, (Math.PI/180)*360); // 円のパス
         ctx.closePath(); // パスを閉じる
         ctx.fillStyle = &quot;blue&quot;; // 点の色
         ctx.fill(); // 点を塗りつぶす
      }
   }
   
   /* 折線グラフを描く函数 */
   function drawLineGraph(canvasID) {
      const canvas = document.getElementById(canvasID);
      const ctx = canvas.getContext(&quot;2d&quot;);
   
      // プロットした点を折線で結ぶ
      for (let i = 0; i &lt; plotXSet.length; i++) {
         ctx.beginPath(); // パスを初期化
         ctx.moveTo(plotXSet[i], plotYSet[i]); // 折線の始点
         ctx.lineTo(plotXSet[i + 1], plotYSet[i + 1]); // 折線の終点
         ctx.strokeStyle = &quot;red&quot;; // 折線の色
         ctx.stroke(); // 折線の描画
         
      }
   }

   /* 7つのcanvas要素に各々対応づける7つの函数 */
   
   function myCanvas1(canvasID) {
      drawBackgroundOfCanvas(canvasID)
      drawGraphPaper(canvasID);
      drawAxis(canvasID);
      drawScaleItems(canvasID);
      writeString(canvasID);
      plotData(canvasID);
      drawLineGraph(canvasID);
   }
   
   function myCanvas2(canvasID) {
      drawBackgroundOfCanvas(canvasID)
      drawGraphPaper(canvasID);
   }
   
   function myCanvas3(canvasID) {
      drawBackgroundOfCanvas(canvasID)
      drawGraphPaper(canvasID);
      drawAxis(canvasID);
   }
   
   function myCanvas4(canvasID) {
      drawBackgroundOfCanvas(canvasID)
      drawGraphPaper(canvasID);
      drawAxis(canvasID);
      drawScaleItems(canvasID);
   }
   
   function myCanvas5(canvasID) {
      drawBackgroundOfCanvas(canvasID)
      drawGraphPaper(canvasID);
      drawAxis(canvasID);
      drawScaleItems(canvasID);
      writeString(canvasID);
   }
   
   function myCanvas6(canvasID) {
      drawBackgroundOfCanvas(canvasID)
      drawGraphPaper(canvasID);
      drawAxis(canvasID);
      drawScaleItems(canvasID);
      writeString(canvasID);
      plotData(canvasID);
   }

   function myCanvas7(canvasID) {
      drawBackgroundOfCanvas(canvasID)
      drawGraphPaper(canvasID);
      drawAxis(canvasID);
      drawScaleItems(canvasID);
      writeString(canvasID);
      plotData(canvasID);
      drawLineGraph(canvasID);
   }
   
   // このHTML文書が最後まで読み込まれた後に各函数を呼び出す
   myCanvas1(&quot;JapanInflationRateTimeSeries1&quot;);
   myCanvas2(&quot;JapanInflationRateTimeSeries2&quot;);
   myCanvas3(&quot;JapanInflationRateTimeSeries3&quot;);
   myCanvas4(&quot;JapanInflationRateTimeSeries4&quot;);
   myCanvas5(&quot;JapanInflationRateTimeSeries5&quot;);
   myCanvas6(&quot;JapanInflationRateTimeSeries6&quot;);
   myCanvas7(&quot;JapanInflationRateTimeSeries7&quot;);

})(); // 袋とじ用の匿名函数の終わり
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/5777112928691410008/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2021/09/html5-canvasjavascript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/5777112928691410008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/5777112928691410008'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2021/09/html5-canvasjavascript.html' title='HTML5 CanvasとJavaScriptで折線グラフを描いてみた'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-4973226187406773293</id><published>2021-08-24T21:33:00.002+09:00</published><updated>2025-09-04T11:09:37.073+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="情報処理"/><category scheme="http://www.blogger.com/atom/ns#" term="情報科学"/><category scheme="http://www.blogger.com/atom/ns#" term="数学"/><title type='text'>指数表記、科学的記数法、工学的記数法、浮動小数点数</title><content type='html'>&lt;p&gt;科学雑誌や理系の教科書やコンピュータ・プログラミングの書物で次のような数値表記を目にすることがよくある。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ 5.972 \times 10^{24} \]
\[ 6.62607015 \times 10^{−34} \]
\[ 6.02214076 \times 10^{23} \]&lt;/div&gt;
&lt;p&gt;これらは日本語では&lt;ruby&gt;指数&lt;rt&gt;しすう&lt;/rt&gt;&lt;/ruby&gt;表記という名前で知られている。英語ではscientific notation（科学的記数法）やstandard index form（標準指数形）と呼ばれている。&lt;/p&gt;
&lt;p&gt;指数表記では0以外の数値を次のように10の累乗を掛けた式にして表す。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ m \times 10^n \]&lt;/div&gt;
&lt;p&gt;以下、mを仮数部、10を基数部、nを指数部と呼ぶことにする。&lt;/p&gt;
&lt;p&gt;コンピュータ科学の分野ではEまたはeを使って指数部を表記する。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ mEn \]
\[ men \]&lt;/div&gt;
&lt;h4&gt;指数表記を通常の記数法へ変換&lt;/h4&gt;
&lt;p&gt;指数表記を通常の記数法に変換する方法はその指数部が正の数か負の数かで異なる。&lt;/p&gt;
&lt;p&gt;指数部が正の数である場合、仮数部（かけられる数）の小数点を指数部の数だけ右へ移動させる。そして空白の桁には0を与える。例えば次のように。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ 4.9 \times 10^6 = 4900000.0 = 4900000 \]&lt;/div&gt;
&lt;p&gt;4.9の小数点を右へ6桁移動させると0の桁が5つ加わって4900000になる。これで変換完了。&lt;/p&gt;
&lt;p&gt;指数部が負の数である場合、仮数部の小数点を指数部の数だけ左へ移動させる。そして空白の桁には0を与える。例えば次のように。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ 4.9 \times 10^{-6} = 0.0000049 \]&lt;/div&gt;
&lt;p&gt;4.9の小数点を左へ6桁移動させると\( \dfrac{1}{1000000} \)になって0.0000049になる。これで変換完了。&lt;/p&gt;
&lt;h4&gt;指数表記へ変換&lt;/h4&gt;
&lt;p&gt;通常の記数法で表されている数値を指数表記に変換するには次のようにする。&lt;/p&gt;
&lt;p&gt;ここでは203000000を例に挙げる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;小数点を最大桁の右隣りまで左へ移動させる。
&lt;span class=&quot;math&quot;&gt;\[ 203000000 \Rightarrow 2.03000000 \]&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;その小数点から右に何桁あるか数える。この例では8桁。指数部が8と決まる。&lt;/li&gt;
&lt;li&gt;有効数字（この例では2.03）を残して残りの0の桁を削除。
&lt;span class=&quot;math&quot;&gt;\[ 2.03000000 \Rightarrow 2.03 \]&lt;/span&gt;
これで仮数部が決まる。&lt;/li&gt;
&lt;li&gt;最後に仮数部と基数部と指数部とを組み合わせて式にすれば指数表記への変換が完了。
&lt;span class=&quot;math&quot;&gt;\[ 203000000 = 2.03 \times 10^8 \]&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ここで言うところの有効数字とは、0以外の数がある桁とそれらに挟まれた0の桁を残してそれ以外の0の桁を省いた数のこと。7036000なら7036が有効数字、0.030052なら30052が有効数字。&lt;/p&gt;
&lt;p&gt;小数の場合は次のように変換する。ここでは0.0000683を例に挙げる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;小数点より左の0を取り除く。
&lt;span class=&quot;math&quot;&gt;\[ 0.0000683 \Rightarrow .0000683 \]&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;小数点を有効数字の中で最大の桁の右隣りまで移動させる。
&lt;span class=&quot;math&quot;&gt;\[ .0000683 \Rightarrow 00006.83 \]&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;0の桁を含めて小数点よりも左に何桁あるかを数える。この例では5桁あることが分かる。&lt;/li&gt;
&lt;li&gt;5に-1を掛けて-5にすると、この-5が指数部の値になる。&lt;/li&gt;
&lt;li&gt;有効数字以外の左側の0の桁をすべて取り除く。この値が仮数部になる。
&lt;span class=&quot;math&quot;&gt;\[ 00006.83 \Rightarrow 6.83 \]&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;最後に仮数部と基数部と指数部とを組み合わせる。これで指数表記への変換が完了。
&lt;span class=&quot;math&quot;&gt;\[ 0.0000683 = 6.83 \times 10^{-5} \]&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;計算機（電卓やコンピュータ）での指数表記&lt;/h4&gt;
&lt;p&gt;主要な電卓や主要なコンピュータ・プログラミング言語での指数表記では、10の累乗を掛ける代わりにEもしくはeが用いられていることが多い。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ mEn \]&lt;/div&gt;
&lt;p&gt;例えば次の表記は等式で並べられたもの同士がそれぞれ等しい数を表している。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;4900000 = 4.9 * 10^6 = 4.9E6 = 4.9e6 = 4.9e+6 = 4.9e+06
0.0000049 = 4.9 * 10^-6 = 4.9E-6 = 4.9e-6 = 4.9e-06
203000000 = 2.03 * 10^8 = 2.03E8 = 2.03e8 = 2.03e+8 = 2.03e+08
0.0000683 = 6.83 * 10^-5 = 6.83E-5 = 6.83e-5 = 6.83e-05&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;プログラミング言語の種類によってはこれらと異なる表記法が使われている。&lt;/p&gt;
&lt;h4&gt;工学的記数法&lt;/h4&gt;
&lt;p&gt;指数表記の指数部を3の倍数で表す工学的記数法というものがある。英語ではengineering notationとかengineering formと呼ばれているらしい。&lt;/p&gt;
&lt;p&gt;指数部が3の倍数となる累乗は単位名称によく使われる接頭辞に次のように対応している。&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;\( m \times 10^3 \)&lt;/td&gt;
&lt;td&gt;mE3&lt;/td&gt;
&lt;td&gt;キロ (k)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\( m \times 10^6 \)&lt;/td&gt;
&lt;td&gt;mE6&lt;/td&gt;
&lt;td&gt;メガ (M)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\( m \times 10^9 \)&lt;/td&gt;
&lt;td&gt;mE9&lt;/td&gt;
&lt;td&gt;ギガ (G)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\( m \times 10^{12} \)&lt;/td&gt;
&lt;td&gt;mE12&lt;/td&gt;
&lt;td&gt;テラ (T)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\( m \times 10^{15} \)&lt;/td&gt;
&lt;td&gt;mE15&lt;/td&gt;
&lt;td&gt;ペタ (P)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;
&lt;h4&gt;浮動小数点数&lt;/h4&gt;
&lt;p&gt;計算機で用いられ、プログラミング言語でもお馴染みの浮動小数点数は、指数表記と同じ構造を持っている。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ S \times  B^e \]&lt;/div&gt;
&lt;p&gt;Sの部分は日本語で仮数部、英語ではsignificandと呼ばれ、Bの部分は日本語で基数部、英語ではbaseと呼ばれ、eは日本語で指数部、英語ではexponentと呼ばれている。&lt;/p&gt;
&lt;p&gt;ちなみに浮動小数点数は英語ではa floating-point numberと呼ばれている。&lt;/p&gt;
&lt;p&gt;浮動小数点数は計算機内ではバイナリーナンバー、つまり2進数として扱われる。2進数の場合、基数部が10ではなく2になり、仮数部と指数部のすべての桁が0か1になる。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/4973226187406773293/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2021/08/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/4973226187406773293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/4973226187406773293'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2021/08/blog-post.html' title='指数表記、科学的記数法、工学的記数法、浮動小数点数'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-5090877743738473502</id><published>2021-07-18T06:40:00.017+09:00</published><updated>2026-03-03T21:55:56.740+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GNU Octave"/><category scheme="http://www.blogger.com/atom/ns#" term="Julia"/><category scheme="http://www.blogger.com/atom/ns#" term="Maxima"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="Python3"/><category scheme="http://www.blogger.com/atom/ns#" term="R言語"/><category scheme="http://www.blogger.com/atom/ns#" term="数学"/><category scheme="http://www.blogger.com/atom/ns#" term="線形代数"/><category scheme="http://www.blogger.com/atom/ns#" term="行列"/><title type='text'>行列式、ラプラス展開、逆行列、行列の割り算</title><content type='html'>&lt;p&gt;この投稿では行列の&lt;ruby&gt;&lt;rb&gt;除法&lt;/rb&gt;&lt;rt&gt;じょほう&lt;/rt&gt;&lt;/ruby&gt;とそのために前提となるいくつかの予備知識について記した。ただし行列同士の非&lt;ruby&gt;&lt;rb&gt;可換&lt;/rb&gt;&lt;rt&gt;かかん&lt;/rt&gt;&lt;/ruby&gt;的な乗法についての基礎知識があることを前提にしている。非可換というのは交換法則が成り立たないこと。&lt;/p&gt;
&lt;h4&gt;逆数&lt;/h4&gt;
&lt;p&gt;分数の割り算では後者の分数の分母と分子をひっくり返して掛け算をすることがよく知られている。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \dfrac{a}{b} \div \dfrac{\colorbox{yellow}{c}}{\colorbox{cyan}{d}}
= \dfrac{a}{b} \cdot \dfrac{\colorbox{cyan}{d}}{\colorbox{yellow}{c}}
= \dfrac{ad}{bc} \]&lt;/div&gt;
&lt;p&gt;分子と分母をひっくり返した分数は元の分数の&lt;ruby&gt;&lt;rb&gt;逆数&lt;/rb&gt;&lt;rt&gt;ぎゃくすう&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。英語で逆数はthe multiplicative inverseと呼ばれている。&lt;/p&gt;
&lt;p&gt;例えば6の逆数は6分の1となる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ 6 = \dfrac{6}{1} \rightarrow \dfrac{1}{6} \]&lt;/div&gt;
&lt;p&gt;ある数をaとし、その逆数をxとすると、aとxを掛け算すると1になるという関係が成り立つ。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ ax = xa = 1 \]&lt;/div&gt;
&lt;p&gt;\( x \)を未知の逆数としてこの方程式を解くとa分の1が得られる。そのために両辺をaで割っている。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
ax &amp;amp;= 1 \\
\dfrac{\cancel{a}x}{\cancel{a}} &amp;amp;= \dfrac{1}{a} \\
x &amp;amp;= \dfrac{1}{a}
\end{align} \]&lt;/div&gt;
&lt;p&gt;aとその逆数であるa分の1とを掛け算すると、その答えは1になることが分かる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ a \cdot \dfrac{1}{a} = \dfrac{a}{1} \cdot \dfrac{1}{a} = \dfrac{a \cdot 1}{1 \cdot a} = \dfrac{a}{a} = 1 \]&lt;/div&gt;
&lt;p&gt;例えば次のように。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ 3 \cdot \dfrac{1}{3} = \dfrac{3 \cdot 1}{1 \cdot 3} = \dfrac{3}{3} = 1 \]
\[ 1.5 \cdot \dfrac{10}{15} = \dfrac{15 \cdot 10}{10 \cdot 15} = \dfrac{150}{150} = 1 \]
\[ \dfrac{2}{5} \cdot \dfrac{5}{2} = \dfrac{2 \cdot 5}{5 \cdot 2} = \dfrac{10}{10} = 1 \]
\[ \dfrac{5}{7} \cdot \dfrac{7}{5} = \dfrac{5 \cdot 7}{7 \cdot 5} = \dfrac{35}{35} = 1 \]&lt;/div&gt;
&lt;h4&gt;単位行列&lt;/h4&gt;
&lt;p&gt;次のような行列は&lt;ruby&gt;&lt;rb&gt;単位&lt;/rb&gt;&lt;rt&gt;たんい&lt;/rt&gt;&lt;/ruby&gt;行列と呼ばれている。説明するよりもぱっと見たほうが分かりやすい。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align} I_2 &amp;amp;=
\begin{pmatrix} 1 &amp;amp; 0 \\
0 &amp;amp; 1 \end{pmatrix} \\\\
I_3 &amp;amp;= \begin{pmatrix} 1 &amp;amp; 0 &amp;amp; 0 \\
0 &amp;amp; 1 &amp;amp; 0 \\
0 &amp;amp; 0 &amp;amp; 1 \end{pmatrix} \\\\
I_4 &amp;amp;= \begin{pmatrix} 1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 \\
0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 \end{pmatrix}
\end{align} \]&lt;/div&gt;
&lt;p&gt;行列の左上端から右下端へと対角線上に1が並び、それ以外は0によって満たされていることが見て取れる。これらが単位行列。単位行列は対角行列の一種。&lt;/p&gt;
&lt;p&gt;\( I \)の右下添字は行列の成分である1の数に対応している。\( I_2 \)は2次の単位行列、\( I_3 \)は3次の単位行列、\( I_4 \)は4次の単位行列。\( I \)は単位行列のことを英語でan identity matrixと呼ぶので、その頭文字。日本では\( I_n \)ではなく\( E_n \)と書かれていることもある。&lt;/p&gt;
&lt;p&gt;単位行列はその名のとおり&lt;ruby&gt;&lt;rb&gt;単位元&lt;/rb&gt;&lt;rt&gt;たんいげん&lt;/rt&gt;&lt;/ruby&gt;の行列バージョン。単位行列は行列同士の掛け算において単位元として機能する。&lt;/p&gt;
&lt;p&gt;単位元とは、ある演算の中で値をいつも変化させることがない数のこと。例えば実数の掛け算では1がそれに当たる。1にどんな実数のrを掛けても、どんな実数のrに1を掛けても、rの値は変わらない。&lt;/p&gt;
&lt;p&gt;例えば\( f(x) = x \times 1 \)のような&lt;ruby&gt;&lt;rb&gt;函数&lt;/rb&gt;&lt;rt&gt;かんすう&lt;/rt&gt;&lt;/ruby&gt;を考えてみる。この函数が出力する値は入力する値に等しく、いつも\( x \)になる。その意味で&lt;ruby&gt;&lt;rb&gt;中立元&lt;/rb&gt;&lt;rt&gt;ちゅうりつげん&lt;/rt&gt;&lt;/ruby&gt;や英語のように&lt;ruby&gt;&lt;rb&gt;同一元&lt;/rb&gt;&lt;rt&gt;どういつげん&lt;/rt&gt;&lt;/ruby&gt;と呼んでもいい。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
x \cdot 1 &amp;amp;= x \\
1 \cdot x &amp;amp;= x
\end{align} \]&lt;/div&gt;
&lt;p&gt;行列の掛け算では単位行列が単位元の役割を果たしている。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix} a &amp;amp; b \\ c &amp;amp; d \end{pmatrix}
\cdot \begin{pmatrix} 1 &amp;amp; 0 \\ 0 &amp;amp; 1 \end{pmatrix}
= \begin{pmatrix} a &amp;amp; b \\ c &amp;amp; d \end{pmatrix} \]
\[ \begin{pmatrix} 1 &amp;amp; 0 \\ 0 &amp;amp; 1 \end{pmatrix}
\cdot \begin{pmatrix} a &amp;amp; b \\ c &amp;amp; d \end{pmatrix}
= \begin{pmatrix} a &amp;amp; b \\ c &amp;amp; d \end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;この性質は2次に限らず、n次の&lt;ruby&gt;&lt;rb&gt;正方&lt;/rb&gt;&lt;rt&gt;せいほう&lt;/rt&gt;&lt;/ruby&gt;行列とそれと同じn次の単位行列の間でも成り立つ。行の数mと列の数nが等しい行列、つまり（\( m = n \)）行列は正方行列と呼ばれている。&lt;/p&gt;
&lt;p&gt;\( A_n \)はn次の正方行列、\( I_n \)はn次の単位行列。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align} A_n \cdot I_n = A_n I_n &amp;amp;= A_n \\
I_n \cdot A_n = I_n A_n &amp;amp;= A_n \end{align} \]&lt;/div&gt;
&lt;p&gt;ただし、行列の掛け算で重要な点は交換法則が通常成り立たないこと。この性質は非&lt;ruby&gt;&lt;rb&gt;可換&lt;/rb&gt;&lt;rt&gt;かかん&lt;/rt&gt;&lt;/ruby&gt;性と呼ばれている。AとBが共に行列だとし、その非可換性を式で表すと次のようになる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A \cdot B \neq B \cdot A \]
\[ A \cdot B \neq B \cdot A \]
\[ AB \neq BA \]&lt;/div&gt;
&lt;h4&gt;逆行列&lt;/h4&gt;
&lt;p&gt;行列の割り算も分数の割り算のときに逆数を掛けることと同様の方法でその答えを求めることができる。&lt;/p&gt;
&lt;p&gt;行列の逆数とは何か。それが&lt;ruby&gt;&lt;rb&gt;逆&lt;/rb&gt;&lt;rt&gt;ぎゃく&lt;/rt&gt;&lt;/ruby&gt;行列というもの。英語では逆行列の一様な呼び方がない。「逆の」を意味する形容詞のinverseを使ってthe inverse of a matrixと呼ばれていたりa matrix inverseやa matrix inversionと呼ばれていたりする。&lt;/p&gt;
&lt;p&gt;逆行列は逆数と共に&lt;ruby&gt;&lt;rb&gt;逆元&lt;/rb&gt;&lt;rt&gt;ぎゃくげん&lt;/rt&gt;&lt;/ruby&gt;として一般化できるもの。逆元は英語でan inverse element。&lt;/p&gt;
&lt;p&gt;\( A_n \)をn次の&lt;ruby&gt;&lt;rb&gt;正方&lt;/rb&gt;&lt;rt&gt;せいほう&lt;/rt&gt;&lt;/ruby&gt;行列、\( I_n \)をn次の単位行列としたとき、次のような関係が成り立てば\( X \)は\( A \)の逆行列。正方行列とは列数と行数とが等しい行列のこと。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
A_n &amp;amp;= \begin{pmatrix}
a_{11} &amp;amp; a_{12} &amp;amp; a_{13} &amp;amp; \cdots &amp;amp; a_{1n} \\
a_{21} &amp;amp; a_{22} &amp;amp; a_{23} &amp;amp; \cdots &amp;amp; a_{2n} \\
a_{31} &amp;amp; a_{32} &amp;amp; a_{33} &amp;amp; \cdots &amp;amp; a_{3n} \\
\vdots &amp;amp; \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots \\
a_{n1} &amp;amp; a_{n2} &amp;amp; a_{n3} &amp;amp; \cdots &amp;amp; a_{nn}
\end{pmatrix} \\\\
I_n &amp;amp;= \begin{pmatrix}
1 &amp;amp; 0 &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0 \\
0 &amp;amp; 1 &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; \cdots &amp;amp; 0 \\
\vdots &amp;amp; \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; \cdots &amp;amp; 1 \end{pmatrix}
\end{align} \]&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
A_n \cdot X = A_n X &amp;amp;= I_n \\
X \cdot A_n = X A_n &amp;amp;= I_n
\end{align} \]&lt;/div&gt;
&lt;p&gt;このことは実数の掛け算においてaとその逆数xと掛け算の単位元である1との関係と同じ。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ ax = xa = 1 \]&lt;/div&gt;
&lt;p&gt;逆行列は負の&lt;ruby&gt;&lt;rb&gt;指数&lt;/rb&gt;&lt;rt&gt;しすう&lt;/rt&gt;&lt;/ruby&gt;を使って\( A^{-1} \)と表されることがある。これは\( \dfrac{1}{a} = a^{-1} \)と表すことに&lt;ruby&gt;&lt;rb&gt;倣&lt;/rb&gt;&lt;rt&gt;なら&lt;/rt&gt;&lt;/ruby&gt;っている。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
a^{-0} &amp;amp;= \dfrac{1}{a^0} = \dfrac{1}{1} \\
a^{-1} &amp;amp;= \dfrac{1}{a^1} = \dfrac{1}{a} \\
a^{-2} &amp;amp;= \dfrac{1}{a^2} \\
a^{-3} &amp;amp;= \dfrac{1}{a^3} \\
&amp;amp; \vdots &amp;amp; \\
a^{-n} &amp;amp;= \dfrac{1}{a^n}
\end{align} \]&lt;/div&gt;
&lt;p&gt;この\( A^{-1} \)を先程の関係式のXに代入すると次の式が得られる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
A \cdot A^{-1} = A A^{-1} &amp;amp;= I \\
A^{-1} \cdot A = A^{^1} A &amp;amp;= I
\end{align} \]&lt;/div&gt;
&lt;p&gt;これは正方行列にその逆行列を掛けると単位行列が得られることを示している。しかもこの場合にかぎって交換法則が成り立つ。&lt;/p&gt;
&lt;h4&gt;行列式&lt;/h4&gt;
&lt;p&gt;&lt;ruby&gt;&lt;rb&gt;行列式&lt;/rb&gt;&lt;rt&gt;ぎょうれつしき&lt;/rt&gt;&lt;/ruby&gt;は正方行列を実数や&lt;ruby&gt;&lt;rb&gt;複素数&lt;/rb&gt;&lt;rt&gt;ふくそすう&lt;/rt&gt;&lt;/ruby&gt;などのスカラーに変換するもの。スカラーとは行列と区別される単独の実数や複素数のこと。&lt;/p&gt;
&lt;p&gt;n次の正方行列を入力すると、ある決まった実数や複素数を出力するような&lt;ruby&gt;&lt;rb&gt;函数&lt;/rb&gt;&lt;rt&gt;かんすう&lt;/rt&gt;&lt;/ruby&gt;として行列式を考えることができる。&lt;/p&gt;
&lt;p&gt;行列式は正方行列からその逆行列を導き出すために役に立つ。ただし、全ての正方行列が逆行列を持つわけではない。正方行列の行列式を計算することでその正方行列が逆行列を持つかどうかを確かめることができる。逆行列を持つことができる正方行列は行列式の値が0以外になる。そのような正方行列は特に&lt;ruby&gt;&lt;rb&gt;正則&lt;/rb&gt;&lt;rt&gt;せいそく&lt;/rt&gt;&lt;/ruby&gt;行列と呼ばれている。&lt;/p&gt;
&lt;p&gt;Aが正方行列だとするとその行列式は\( |A| \)や\( det\ A \)やdet(A)と表すことができる。detというのは行列式の英語の呼び方であるa determinantの略記。&lt;/p&gt;
&lt;p&gt;2次の正方行列の行列式が最も簡単で、しかも行列式の基本となるもの。ここではAの添字の2によって2次の正方行列を表すことにする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A_2 = \begin{pmatrix} a &amp;amp; b \\ c &amp;amp; d \end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;2次正方行列を次のように展開することによってその行列式を計算することができる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
det\ A_2 &amp;amp;= |A_2| \\
&amp;amp;= \begin{vmatrix} \colorbox{yellow}{\( a \)} &amp;amp; \colorbox{cyan}{\( b \)} \\
\colorbox{cyan}{\( c \)} &amp;amp; \colorbox{yellow}{\( d \)} \end{vmatrix} \\
&amp;amp;= \colorbox{yellow}{\( a \cdot d \)} - \colorbox{cyan}{\( b \cdot c \)} \\
&amp;amp;= \colorbox{yellow}{\( ad \)} - \colorbox{cyan}{\( bc \)} \end{align} \]&lt;/div&gt;
&lt;p&gt;\( ad - bc \)が2次正方行列の行列式。2次正方行列の対角線上の成分同士を掛けたadとbcとの差になっていることが分かる。\( ad + (-bc) \)と理解することもできる。&lt;/p&gt;
&lt;p&gt;3次の正方行列の行列式はやや複雑。3次以上の正方行列ではラプラス展開を用いることによって行列式を求めることができる。ラプラス展開は&lt;ruby&gt;&lt;rb&gt;余因子&lt;/rb&gt;&lt;rt&gt;よいんし&lt;/rt&gt;&lt;/ruby&gt;展開とも呼ばれている。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A_3 = \begin{pmatrix} a &amp;amp; b &amp;amp; c \\
d &amp;amp; e &amp;amp; f \\ g &amp;amp; h &amp;amp; i \end{pmatrix} \]&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
det\ A_3 &amp;amp;= |A_3| \\\\
&amp;amp;= \begin{vmatrix} a &amp;amp; b &amp;amp; c \\
d &amp;amp; e &amp;amp; f \\ g &amp;amp; h &amp;amp; i \end{vmatrix} \\\\
&amp;amp;= a \left( \begin{vmatrix} e &amp;amp; f \\ h &amp;amp; i \end{vmatrix} \right)
+ b \left( -\begin{vmatrix} d &amp;amp; f \\ g &amp;amp; i \end{vmatrix} \right)
+ c \left( \begin{vmatrix} d &amp;amp; e \\ g &amp;amp; h \end{vmatrix} \right) \\\\
&amp;amp;= a \begin{vmatrix} e &amp;amp; f \\ h &amp;amp; i \end{vmatrix}
- b \begin{vmatrix} d &amp;amp; f \\ g &amp;amp; i \end{vmatrix}
+ c \begin{vmatrix} d &amp;amp; e \\ g &amp;amp; h \end{vmatrix} \\\\
&amp;amp;= a(ei - fh) - b(di - fg) + c(dh - eg) \end{align} \]&lt;/div&gt;
&lt;p&gt;\( \begin{vmatrix} a &amp;amp; b &amp;amp; c \\ d &amp;amp; e &amp;amp; f \\ g &amp;amp; h &amp;amp; i \end{vmatrix} \)を3つの\( \begin{vmatrix} e &amp;amp; f \\ h &amp;amp; i \end{vmatrix} \)と\( \begin{vmatrix} d &amp;amp; f \\ g &amp;amp; i \end{vmatrix} \)と\( \begin{vmatrix} d &amp;amp; e \\ g &amp;amp; h \end{vmatrix} \)とに分けているところに注目。&lt;/p&gt;
&lt;p&gt;これらの3つの部分は行列\( A_3 \)の1番目の行に沿ったa, b, cのそれぞれ&lt;ruby&gt;&lt;rb&gt;小行列式&lt;/rb&gt;&lt;rt&gt;しょうぎょうれつしき&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。小行列式はスカラー（実数か複素数）であり、\( ei - fh \)と\( di - fg \)と\( dh - eg \)で表すことができる。&lt;/p&gt;
&lt;p&gt;各々の小行列式に対し、一定の規則と順番に従って1か-1を交互に掛けたものは、これらa, b, cのそれぞれ&lt;ruby&gt;&lt;rb&gt;余因子&lt;/rb&gt;&lt;rt&gt;よいんし&lt;/rt&gt;&lt;/ruby&gt;と呼ばれている。&lt;/p&gt;
&lt;p&gt;ここではaの\( \begin{vmatrix} e &amp;amp; f \\ h &amp;amp; i \end{vmatrix} = ei - fh \)、そしてbの\( -\begin{vmatrix} d &amp;amp; f \\ g &amp;amp; i \end{vmatrix} = -(di - fg) \)、そしてcの\( \begin{vmatrix} d &amp;amp; e \\ g &amp;amp; h \end{vmatrix} = dh - eg \)がそれぞれ余因子。&lt;/p&gt;
&lt;p&gt;ラプラス展開ではこれらの余因子にそれらの元の成分の値であるa, b, cを掛ける手続きが必要になる。ただし、行列とスカラーである行列式とは異なるので、表記法が似ているからと言って、例えば\( a \begin{vmatrix} b &amp;amp; c \\ d &amp;amp; e \end{vmatrix} \)を行列のスカラー倍であると勘違いして\( \begin{vmatrix} a b &amp;amp; a c \\ a d &amp;amp; a e \end{vmatrix} \)と計算してしまうのは間違い。\(a (b e - c d) \)と計算するのが正しい。||で挟んだ小行列式の表記法では丸括弧が省略されてしまっているので要注意。&lt;/p&gt;
&lt;p&gt;小行列式は行列の前にdetを添えて次のように表記されることもある。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ det \begin{pmatrix} a &amp;amp; b &amp;amp; c \\
d &amp;amp; e &amp;amp; f \\ g &amp;amp; h &amp;amp; i \end{pmatrix}
 = a \cdot det \begin{pmatrix} e &amp;amp; f \\ h &amp;amp; i \end{pmatrix}
 - b \cdot det \begin{pmatrix} d &amp;amp; f  \\ g &amp;amp; i \end{pmatrix}
 + c \cdot det \begin{pmatrix} d &amp;amp; e \\ g &amp;amp; h \end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;ラプラス展開のアルゴリズムは一見すると複雑そうに見えるが、次の表を見れば一目瞭然。&lt;/p&gt;
&lt;h4&gt;ラプラス展開のアルゴリズム&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;次のような3次の正方行列があるとする。
&lt;div class=&quot;math&quot;&gt;\[ A = \begin{pmatrix} a &amp;amp; b &amp;amp; c \\
d &amp;amp; e &amp;amp; f \\ g &amp;amp; h &amp;amp; i \end{pmatrix} \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;そのうちの行か列のいずれか1つを選ぶ。ここでは1番目の行（その成分はa, b, c）を選んだ。どの行、どの列を選んでも同じ計算結果が得られる。
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
\colorbox{yellow}{\( a \)} &amp;amp; \colorbox{yellow}{\( b \)} &amp;amp; \colorbox{yellow}{\( c \)}
\\ d &amp;amp; e &amp;amp; f \\ g &amp;amp; h &amp;amp; i
\end{pmatrix} \]&lt;/div&gt;
&lt;table class=&quot;center&quot;&gt;
&lt;tr class=&quot;entry&quot;&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;e&lt;/td&gt;
&lt;td&gt;f&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;g&lt;/td&gt;
&lt;td&gt;h&lt;/td&gt;
&lt;td&gt;i&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/li&gt;
&lt;li&gt;選んだ行の成分a, b, cについて、次のようにして各々の小行列式を求める。
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
\cancel{\colorbox{yellow}{\( a \)}} &amp;amp; \cancel{b} &amp;amp; \cancel{c} \\
\cancel{d} &amp;amp; e &amp;amp; f \\
\cancel{g} &amp;amp; h &amp;amp; i \end{pmatrix} \]&lt;/div&gt;
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class=&quot;minor&quot;&gt;e&lt;/td&gt;
&lt;td class=&quot;minor&quot;&gt;f&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class=&quot;minor&quot;&gt;h&lt;/td&gt;
&lt;td class=&quot;minor&quot;&gt;i&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;aが属す列と行を消した残り、したがって\( a \cdot \begin{vmatrix} e &amp;amp; f \\ h &amp;amp; i \end{vmatrix} = a(ei - fh) \)が得られる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
\cancel{a} &amp;amp; \cancel{\colorbox{yellow}{\( b \)}} &amp;amp; \cancel{c} \\
d &amp;amp; \cancel{e} &amp;amp; f \\
g &amp;amp; \cancel{h} &amp;amp; i \end{pmatrix} \]&lt;/div&gt;
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;minor&quot;&gt;d&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class=&quot;minor&quot;&gt;f&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;minor&quot;&gt;g&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class=&quot;minor&quot;&gt;i&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;bが属す列と行を消した残り、したがって\( b \cdot \begin{vmatrix} d &amp;amp; f \\ g &amp;amp; i \end{vmatrix} = b(di - fg) \)が得られる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
\cancel{a} &amp;amp; \cancel{b} &amp;amp; \cancel{\colorbox{yellow}{\( c \)}} \\
d &amp;amp; e &amp;amp; \cancel{f} \\
g &amp;amp; h &amp;amp; \cancel{i} \end{pmatrix} \]&lt;/div&gt;
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;minor&quot;&gt;d&lt;/td&gt;
&lt;td class=&quot;minor&quot;&gt;e&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;minor&quot;&gt;g&lt;/td&gt;
&lt;td class=&quot;minor&quot;&gt;h&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;cが属す列と行を消した残り、したがって\( c \cdot \begin{vmatrix} d &amp;amp; e \\ g &amp;amp; h \end{vmatrix} = c(dh - eg) \)が得られる。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;小行列式に順番に正負の符号をそれぞれ割り振る。
&lt;p&gt;符号の割り振り方は次のような規則に従う。ラプラス展開のために2.で選んだ任意の行ないし任意の列が奇数番目にあるときには「正負正負」という順番に交互に符号を割り振り、偶数番目にあるときには「負正負正」という順番に交互に符号を割り振る。&lt;/p&gt;
&lt;p&gt;ここで選んだa, b, cは1番目の行なので、すなわち奇数番目の行なので、正負正負という順番で符号を小行列式に割り振ると、\( a \cdot \begin{vmatrix} e &amp;amp; f \\ h &amp;amp; i \end{vmatrix} \)と\( b \cdot -\begin{vmatrix} d &amp;amp; f \\ g &amp;amp; i \end{vmatrix} \)と\( c \cdot \begin{vmatrix} d &amp;amp; e \\ g &amp;amp; h \end{vmatrix} \)が得られることになる。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;符号付きの小行列式（これを&lt;ruby&gt;&lt;rb&gt;余因子&lt;/rb&gt;&lt;rt&gt;よいんし&lt;/rt&gt;&lt;/ruby&gt;と呼ぶ）同士を合計する。つまり足し算で繋ぐ。
&lt;div class=&quot;math&quot;&gt;\[ +a \cdot \begin{vmatrix} e &amp;amp; f \\ h &amp;amp; i \end{vmatrix}
+ b \cdot -\begin{vmatrix} d &amp;amp; f \\ g &amp;amp; i \end{vmatrix}
+ c \cdot \begin{vmatrix} d &amp;amp; e \\ g &amp;amp; h \end{vmatrix} \]&lt;/div&gt;
&lt;p&gt;これらの符号及び演算子を整理すると次のようになる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ a \begin{vmatrix} e &amp;amp; f \\ h &amp;amp; i \end{vmatrix}
- b \begin{vmatrix} d &amp;amp; f \\ g &amp;amp; i \end{vmatrix}
+ c \begin{vmatrix} d &amp;amp; e \\ g &amp;amp; h \end{vmatrix} \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;2次の正方行列の行列式を求めるときと同様のやり方によって更に展開すると、次のような行列式が最終的に得られることになる。
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
|A| &amp;amp;=
a \begin{vmatrix} \colorbox{yellow}{\( e \)} &amp;amp; \colorbox{cyan}{\( f \)} \\
\colorbox{cyan}{\( h \)} &amp;amp; \colorbox{yellow}{\( i \)} \end{vmatrix}
- b \begin{vmatrix} \colorbox{yellow}{\( d \)} &amp;amp; \colorbox{cyan}{\( f \)} \\
\colorbox{cyan}{\( g \)} &amp;amp; \colorbox{yellow}{\( i \)} \end{vmatrix}
+ c \begin{vmatrix} \colorbox{yellow}{\( d \)} &amp;amp; \colorbox{cyan}{\( e \)} \\
\colorbox{cyan}{\( g \)} &amp;amp; \colorbox{yellow}{\( h \)} \end{vmatrix} \\
&amp;amp;= a(\colorbox{yellow}{\( ei \)} - \colorbox{cyan}{\( fh \)})
- b(\colorbox{yellow}{\( di \)} - \colorbox{cyan}{\( fg \)})
+ c(\colorbox{yellow}{\( dh \)} - \colorbox{cyan}{\( eg \)})
\end{align} \]&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ラプラス展開は3次以上のn次（n行n列）の正方行列にそのまま単純に拡張して応用することができる。基本形となる2次の小行列式になるまで展開し、それらの総和を計算すればいい。&lt;/p&gt;
&lt;p&gt;ラプラス展開について具体例を挙げてみる。例えば次のような3次の正方行列があったとする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A_3 = \begin{pmatrix} -2 &amp;amp; 5 &amp;amp; 10 \\
12 &amp;amp; 7 &amp;amp; -11 \\ 3 &amp;amp; -6 &amp;amp; 15 \end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;この行列式はラプラス展開によって次のようになるはず。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
det\ A_3 &amp;amp;= |A_3| \\\\
&amp;amp;= -2 \cdot \begin{vmatrix} 7 &amp;amp; -11 \\ -6 &amp;amp; 15 \end{vmatrix}
+ 5 \cdot -\begin{vmatrix} 12 &amp;amp; -11 \\ 3 &amp;amp; 15 \end{vmatrix}
+ 10 \cdot \begin{vmatrix} 12 &amp;amp; 7 \\ 3 &amp;amp; -6 \end{vmatrix} \\\\
&amp;amp;= -2 \cdot \begin{vmatrix} 7 &amp;amp; -11 \\ -6 &amp;amp; 15 \end{vmatrix}
- 5 \cdot \begin{vmatrix} 12 &amp;amp; -11 \\ 3 &amp;amp; 15 \end{vmatrix}
+ 10 \cdot \begin{vmatrix} 12 &amp;amp; 7 \\ 3 &amp;amp; -6 \end{vmatrix} \\\\
&amp;amp;= -2 \cdot (7 \cdot 15 + 11 \cdot -6)
- 5 \cdot (12 \cdot 15 + 11 \cdot 3) \\\\
&amp;amp; \hspace{1em} + 10 \cdot (12 \cdot -6 - 7 \cdot 3) \\\\
&amp;amp;= -2 \cdot (105 - 66) - 5 \cdot (180 + 33) + 10 \cdot (-72 - 21) \\\\
&amp;amp;= -2 \cdot 39 - 5 \cdot 213 + 10 \cdot -93 \\\\
&amp;amp;= -78 - 1065 + (-930) \\\\
&amp;amp;= -2073 \end{align} \]&lt;/div&gt;
&lt;p&gt;やや入り組んだ計算だったので&lt;a href=&quot;https://maxima.sourceforge.io/&quot;&gt;Maxima&lt;/a&gt;を使って答え合わせをしてみた。Maximaではdeterminant()函数が行列式の役割を果たしてくれる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ maxima
Maxima 5.42.1 http://maxima.sourceforge.net
（中略）
(%i1) A: matrix([-2,5,10],[12,7,-11],[3,-6,15]);
                              [ - 2   5    10  ]
                              [                ]
(%o1)                         [ 12    7   - 11 ]
                              [                ]
                              [  3   - 6   15  ]
(%i2) determinant(A);
(%o2)                               - 2073
(%i3) quit();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;-2073というスカラーが得られた。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.octave.org/&quot;&gt;GNU Octave&lt;/a&gt;でもdet()函数を用いて同じ結果が得られた。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ octave
GNU Octave, version 4.4.1
（中略）
&amp;gt;&amp;gt; A_3 = [-2,5,10;12,7,-11;3,-6,15]
A_3 =

   -2    5   10
   12    7  -11
    3   -6   15

&amp;gt;&amp;gt; det(A_3)
ans = -2073
&amp;gt;&amp;gt; quit()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://www.r-project.org/&quot;&gt;R言語&lt;/a&gt;でも確かめてみる。R言語でもdet()函数が行列式の役目を果たしてくれる。ちなみに、R言語のmatrix()函数は列順序で値を配列してゆくので、c()函数の引数を行順序で指定した場合にはbyrow=Tの指定が必要になることに要注意。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ R
R version 3.5.2 (2018-12-20) -- &quot;Eggshell Igloo&quot;
（中略）
&amp;gt; A = matrix(c(-2,5,10,12,7,-11,3,-6,15),3,3)
&amp;gt; A
     [,1] [,2] [,3]
[1,]   -2   12    3
[2,]    5    7   -6
[3,]   10  -11   15
&amp;gt; A = matrix(c(-2,5,10,12,7,-11,3,-6,15),3,3,byrow=T)
&amp;gt; A
     [,1] [,2] [,3]
[1,]   -2    5   10
[2,]   12    7  -11
[3,]    3   -6   15
&amp;gt; det(A)
[1] -2073
&amp;gt; q()
Save workspace image? [y/n/c]: n&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;やはり-2073というスカラーが得られた。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://julialang.org/&quot;&gt;Julia&lt;/a&gt;ではどうか。Juliaで行列式を求めるにはdet()函数を用いることができる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type &quot;?&quot; for help, &quot;]?&quot; for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.3
 _/ |\__&#39;_|_|_|\__&#39;_|  |  Debian ⛬  julia/1.0.3+dfsg-4
|__/                   |

julia&amp;gt; A = [-2 5 10;12 7 -11;3 -6 15]
3×3 Array{Int64,2}:
 -2   5   10
 12   7  -11
  3  -6   15

julia&amp;gt; det(A)
ERROR: UndefVarError: det not defined
Stacktrace:
 [1] top-level scope at none:0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;det()函数が見つからないとエラーが生じてしまった。線形代数を使うことをusingで明示的に指定する必要があるようだ。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;julia&amp;gt; using LinearAlgebra

julia&amp;gt; det(A)
-2073.0

julia&amp;gt; exit()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://www.python.org/&quot;&gt;Python 3&lt;/a&gt;でも試してみる。Python 3の場合にはNumpyをインポートしてnumpy.linalg.det()函数を呼び出す。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ python3
Python 3.7.3
（中略）
&amp;gt;&amp;gt;&amp;gt; import numpy as np
&amp;gt;&amp;gt;&amp;gt; A = np.matrix(&#39;-2,5,10;12,7,-11;3,-6,15&#39;)
&amp;gt;&amp;gt;&amp;gt; A
matrix([[ -2,   5,  10],
        [ 12,   7, -11],
        [  3,  -6,  15]])
&amp;gt;&amp;gt;&amp;gt; i = np.linalg.det(A)
&amp;gt;&amp;gt;&amp;gt; i
-2072.9999999999995
&amp;gt;&amp;gt;&amp;gt; exit()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;誤差がやや生じたけれどもPython3でも同様のスカラーが得られた。&lt;/p&gt;
&lt;p&gt;ラプラス展開では、必ずしも行列の最上部の行を用いる必要はない。計算が最も簡単そうな任意の行や任意の列を選ぶことができる。どの行やどの列を選んでもラプラス展開によって同じ行列式の値が得られることは、ラプラス展開の定理のひとつとして知られている。&lt;/p&gt;
&lt;p&gt;例えば次のような4次の正方行列があったとする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A_4 = \begin{pmatrix} -2 &amp;amp; 5 &amp;amp; -3 &amp;amp; 1 \\
0 &amp;amp; -5 &amp;amp; 0 &amp;amp; 10 \\
4 &amp;amp; 7 &amp;amp; -6 &amp;amp; 2 \\
10 &amp;amp; -6 &amp;amp; 1 &amp;amp; 4 \end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;この正方行列をラプラス展開する場合、0が2つある2行目を選ぶことは計算量を減らす点でより賢い道であるかもしれない。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
|A_4| &amp;amp;= -5 \cdot \begin{vmatrix} -2 &amp;amp; -3 &amp;amp; 1 \\
4 &amp;amp; -6 &amp;amp; 2 \\ 10 &amp;amp; 1 &amp;amp; 4 \end{vmatrix}
+ 10 \cdot \begin{vmatrix} -2 &amp;amp; 5 &amp;amp; -3 \\
4 &amp;amp; 7 &amp;amp; -6 \\ 10 &amp;amp; -6 &amp;amp; 1 \end{vmatrix}
\end{align} \]&lt;/div&gt;
&lt;p&gt;各々の小行列式について更に展開する。2次正方行列の行列式と最終的に同じ形になるまで。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
\begin{vmatrix} -2 &amp;amp; -3 &amp;amp; 1 \\
4 &amp;amp; -6 &amp;amp; 2 \\ 10 &amp;amp; 1 &amp;amp; 4 \end{vmatrix}
&amp;amp;= 10 \cdot \begin{vmatrix} -3 &amp;amp; 1 \\ -6 &amp;amp; 2 \end{vmatrix}
+ 1 \cdot -\begin{vmatrix} -2 &amp;amp; 1 \\ 4 &amp;amp; 2 \end{vmatrix}
+ 4 \cdot \begin{vmatrix} -2 &amp;amp; -3 \\ 4 &amp;amp; -6 \end{vmatrix} \\
&amp;amp;= 10 \cdot (-3 \cdot 2 - 1 \cdot -6) - 1 \cdot (-2 \cdot 2 - 1 \cdot 4) \\
&amp;amp; \hspace{1em} + 4 \cdot (-2 \cdot -6 + 3 \cdot 4) \\
&amp;amp;= 10 \cdot (-6 + 6) - 1 \cdot (-4 - 4) + 4 \cdot (12 + 12) \\
&amp;amp;= 10 \cdot 0 + 8 + 4 \cdot 24 \\
&amp;amp;=  104 \end{align} \]&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
\begin{vmatrix} -2 &amp;amp; 5 &amp;amp; -3 \\
4 &amp;amp; 7 &amp;amp; -6 \\ 10 &amp;amp; -6 &amp;amp; 1 \end{vmatrix}
&amp;amp;= 10 \cdot \begin{vmatrix} 5 &amp;amp; -3 \\ 7 &amp;amp; -6 \end{vmatrix}
+ (-6) \cdot -\begin{vmatrix} -2 &amp;amp; -3 \\ 4 &amp;amp; -6 \end{vmatrix}
+ 1 \cdot  \begin{vmatrix} -2 &amp;amp; 5 \\ 4 &amp;amp; 7 \end{vmatrix} \\
&amp;amp;= 10 \cdot (5 \cdot -6 + 3 \cdot 7)
+ 6 \cdot (-2 \cdot -6 + 3 \cdot 4) \\
&amp;amp; \hspace{1em} + (-2 \cdot 7 - 5 \cdot 4) \\
&amp;amp;= 10 \cdot (-30 + 21) + 6 \cdot(12 + 12) + (-14 - 20) \\
&amp;amp;= 10 \cdot -9 + 6 \cdot 24 - 34 \\
&amp;amp;= -90 + 144 - 34 \\
&amp;amp;= -90 + 110 \\
&amp;amp;= 20 \end{align} \]&lt;/div&gt;
&lt;p&gt;計算結果を元の式に代入して2次正方行列のときと同様の形の行列式を得ることができる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
|A_4| &amp;amp;= - 5 \cdot 104 + 10 \cdot 20 \\
&amp;amp;= -520 + 200 \\
&amp;amp;= -320 \end{align} \]&lt;/div&gt;
&lt;p&gt;このようにして-320という計算結果が最終的に得られた。&lt;/p&gt;
&lt;p&gt;R言語で答え合わせ。det()函数で行列式を計算できる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ R
R version 3.5.2 (2018-12-20) -- &quot;Eggshell Igloo&quot;
（中略）
&amp;gt; ele = c(-2,0,4,10,5,-5,7,-6,-3,0,-6,1,1,10,2,4)
&amp;gt; A = matrix(ele,4,4)
&amp;gt; A
     [,1] [,2] [,3] [,4]
[1,]   -2    5   -3    1
[2,]    0   -5    0   10
[3,]    4    7   -6    2
[4,]   10   -6    1    4
&amp;gt; det(A)
[1] -320
&amp;gt; q()
Save workspace image? [y/n/c]: n&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;n次の正方行列のラプラス展開&lt;/h4&gt;
&lt;p&gt;n次の正方行列のラプラス展開についておおざっぱに一般化してみた。&lt;/p&gt;
&lt;p&gt;ある正方行列Aの中の各々の成分は\( a_{ij} \)か\( a_{i,j} \)と書かれる。aの添字のiは列番号を意味し、jは行番号を意味する。nを列か行の最終番号とする。&lt;/p&gt;
&lt;p&gt;正方行列ではその定義からして列数mと行数nが等しいので\( m = n \)となる。したがって正方行列では列も行もその最終番号を共にnだけで示すことにする。&lt;/p&gt;
&lt;table class=&quot;center&quot;&gt;
&lt;caption&gt;行列A&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;i\j&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;\( \cdots \)&lt;/th&gt;
&lt;th&gt;n&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;td&gt;\( a_{11} \)&lt;/td&gt;
&lt;td&gt;\( a_{12} \)&lt;/td&gt;
&lt;td&gt;\( a_{13} \)&lt;/td&gt;
&lt;td&gt;\( \cdots \)&lt;/td&gt;
&lt;td&gt;\( a_{1n} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;td&gt;\( a_{21} \)&lt;/td&gt;
&lt;td&gt;\( a_{22} \)&lt;/td&gt;
&lt;td&gt;\( a_{23} \)&lt;/td&gt;
&lt;td&gt;\( \cdots \)&lt;/td&gt;
&lt;td&gt;\( a_{2n} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;td&gt;\( a_{31} \)&lt;/td&gt;
&lt;td&gt;\( a_{32} \)&lt;/td&gt;
&lt;td&gt;\( a_{33} \)&lt;/td&gt;
&lt;td&gt;\( \cdots \)&lt;/td&gt;
&lt;td&gt;\( a_{3n} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;\( \vdots \)&lt;/th&gt;
&lt;td&gt;\( \vdots \)&lt;/td&gt;
&lt;td&gt;\( \vdots \)&lt;/td&gt;
&lt;td&gt;\( \vdots \)&lt;/td&gt;
&lt;td&gt;\( \ddots \)&lt;/td&gt;
&lt;td&gt;\( \vdots \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;n&lt;/th&gt;
&lt;td&gt;\( a_{n1} \)&lt;/td&gt;
&lt;td&gt;\( a_{n2} \)&lt;/td&gt;
&lt;td&gt;\( a_{n3} \)&lt;/td&gt;
&lt;td&gt;\( \cdots \)&lt;/td&gt;
&lt;td&gt;\( a_{nn} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;正方行列Aから\( a_{ij} \)が属す列iと行jとをすべて削除して残った部分の行列は小行列と呼ばれ、\( A_{ij} \)や\( A_{i,j} \)やA(i,j)などと書かれる。&lt;/p&gt;
&lt;p&gt;例えば行列Aの成分の一つである\( a_{22} \)が属す行と列とを削除して残った部分、つまり色付けされているところがその小行列\( A_{22} \)を意味する。&lt;/p&gt;
&lt;table class=&quot;center&quot;&gt;
&lt;caption&gt;行列Aと小行列A(2,2)&lt;/caption&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;i\j&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;\( \cdots \)&lt;/th&gt;
&lt;th&gt;n&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;td class=&quot;minors&quot;&gt;\( a_{11} \)&lt;/td&gt;
&lt;td&gt;\( a_{12} \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( a_{13} \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( \cdots \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( a_{1n} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;td&gt;\( a_{21} \)&lt;/td&gt;
&lt;td&gt;\( a_{22} \)&lt;/td&gt;
&lt;td&gt;\( a_{23} \)&lt;/td&gt;
&lt;td&gt;\( \cdots \)&lt;/td&gt;
&lt;td&gt;\( a_{2n} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;td class=&quot;minors&quot;&gt;\( a_{31} \)&lt;/td&gt;
&lt;td&gt;\( a_{32} \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( a_{33} \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( \cdots \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( a_{3n} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;\( \vdots \)&lt;/th&gt;
&lt;td class=&quot;minors&quot;&gt;\( \vdots \)&lt;/td&gt;
&lt;td&gt;\( \vdots \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( \vdots \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( \ddots \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( \vdots \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;n&lt;/th&gt;
&lt;td class=&quot;minors&quot;&gt;\( a_{n1} \)&lt;/td&gt;
&lt;td&gt;\( a_{n2} \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( a_{n3} \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( \cdots \)&lt;/td&gt;
&lt;td class=&quot;minors&quot;&gt;\( a_{nn} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;このようにして得られた小行列\( A_{ij} \)の行列式は小行列式と呼ばれ、\( M_{ij} \)と書かれる。Mは英語で小行列式を意味するa minorに由来。\( minor(A)_{ij} \)のように書かれることもある。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ minor(A)_{ij} = M_{ij} \]&lt;/div&gt;
&lt;p&gt;小行列式\( M_{ij} \)に\( (-1)^{i+j} \)を掛けたものは&lt;ruby&gt;&lt;rb&gt;余因子&lt;/rb&gt;&lt;rt&gt;よいんし&lt;/rt&gt;&lt;/ruby&gt;と呼ばれ、\( C_{ij} \)と書かれる。\( cof(A)_{ij} \)とも書かれる。Cとconfは英語で余因子を意味するa cofactorから来ている。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ C_{ij} = cof(A)_{ij} = (-1)^{i+j} M_{ij} \]&lt;/div&gt;
&lt;p&gt;iは列番号、jは行番号。\( (-1)^{i+j} \)の指数部の\( i + j \)が何を意味しているのか直感的に分かりにくいかもしれないので、具体的に計算例をいくつか示してみる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
(-1)^{1+1} &amp;amp;= (-1)^2 = \hspace{1em} 1 \\
(-1)^{1+2} &amp;amp;= (-1)^3 = -1 \\
(-1)^{1+3} &amp;amp;= (-1)^4 = \hspace{1em} 1 \\
(-1)^{1+4} &amp;amp;= (-1)^5 = -1 \\
\vdots \\
(-1)^{2+1} &amp;amp;= (-1)^3 = -1 \\
(-1)^{2+2} &amp;amp;= (-1)^4 = \hspace{1em} 1 \\
(-1)^{2+3} &amp;amp;= (-1)^5 = -1 \\
(-1)^{2+4} &amp;amp;= (-1)^6 = \hspace{1em} 1 \\
\vdots \\
(-1)^{3+1} &amp;amp;= (-1)^4 = \hspace{1em} 1 \\
(-1)^{3+2} &amp;amp;= (-1)^5 = -1 \\
(-1)^{3+3} &amp;amp;= (-1)^6 = \hspace{1em} 1 \\
(-1)^{3+4} &amp;amp;= (-1)^7 = -1 \\
\vdots \\
(-1)^{4+1} &amp;amp;= (-1)^5 = -1 \\
(-1)^{4+2} &amp;amp;= (-1)^6 = \hspace{1em} 1 \\
(-1)^{4+3} &amp;amp;= (-1)^7 = -1 \\
(-1)^{4+4} &amp;amp;= (-1)^8 = \hspace{1em} 1 \\
\end{align} \]&lt;/div&gt;
&lt;p&gt;奇数列だと1, -1, 1, -1, ...となり、偶数列だと-1, 1, -1, 1, ...となっているのが見て取れる。このことは行を選んだ場合も同じ。&lt;/p&gt;
&lt;p&gt;\( (-1)^{i+j} \)を掛けるということは、ある行列の成分の余因子によって作られる余因子行列の符号がちょうどチェッカーフラック状の幾何学的模様のように分布することに等しい。&lt;/p&gt;
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;\( +M_{11} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{12} \)&lt;/td&gt;
&lt;td&gt;\( +M_{13} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{14} \)&lt;/td&gt;
&lt;td&gt;\( +M_{15} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{16} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{21} \)&lt;/td&gt;
&lt;td&gt;\( +M_{22} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{23} \)&lt;/td&gt;
&lt;td&gt;\( +M_{24} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{25} \)&lt;/td&gt;
&lt;td&gt;\( +M_{26} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\( +M_{31} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{32} \)&lt;/td&gt;
&lt;td&gt;\( +M_{33} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{34} \)&lt;/td&gt;
&lt;td&gt;\( +M_{35} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{36} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{41} \)&lt;/td&gt;
&lt;td&gt;\( +M_{42} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{43} \)&lt;/td&gt;
&lt;td&gt;\( +M_{44} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{45} \)&lt;/td&gt;
&lt;td&gt;\( +M_{46} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\( +M_{51} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{52} \)&lt;/td&gt;
&lt;td&gt;\( +M_{53} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{54} \)&lt;/td&gt;
&lt;td&gt;\( +M_{55} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{56} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{61} \)&lt;/td&gt;
&lt;td&gt;\( +M_{62} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{63} \)&lt;/td&gt;
&lt;td&gt;\( +M_{64} \)&lt;/td&gt;
&lt;td class=&quot;negative&quot;&gt;\( -M_{65} \)&lt;/td&gt;
&lt;td&gt;\( +M_{66} \)&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;1は掛け算における単位元なので、1をある数に掛けるとその数は変化しない。-1をある数に掛けるとその数の符号が変わる。正の数ならば負の数に、負の数ならば正の数に。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
1 \cdot M_{11} &amp;amp;= \hspace{1em} M_{11} = C_{11} \\
-1 \cdot M_{12} &amp;amp;= -M_{12} = C_{12} \\
1 \cdot M_{13} &amp;amp;= \hspace{1em} M_{13} = C_{13} \\
-1 \cdot M_{14} &amp;amp;= -M_{14} = C_{14} \\
\vdots \\
-1 \cdot M_{21} &amp;amp;= -M_{21} = C_{21} \\
1 \cdot M_{22} &amp;amp;= \hspace{1em} M_{22} = C_{22} \\
-1 \cdot M_{23} &amp;amp;= -M_{23} = C_{23} \\
1 \cdot M_{24} &amp;amp;= \hspace{1em} M_{24} = C_{24} \\
\vdots \\
1 \cdot M_{31} &amp;amp;= \hspace{1em} M_{31} = C_{31} \\
-1 \cdot M_{32} &amp;amp;= -M_{32} = C_{32} \\
1 \cdot M_{33} &amp;amp;= \hspace{1em} M_{33} = C_{33} \\
-1 \cdot M_{34} &amp;amp;= -M_{34} = C_{34} \\
\vdots \\
\end{align} \]&lt;/div&gt;
&lt;p&gt;というわけで、n次の正方行列\( A_n \)の行列式は次のような多項式として定式化することができる。Cは符号付きの小行列式である余因子。iは列番号、jは行番号。&lt;/p&gt;
&lt;p&gt;ラプラス展開のために任意の行\( a_{i1}, a_{i2}, \cdots, a_{in} \)を選ぶ場合は次のとおり。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
|A_n| &amp;amp;=
a_{i1}C_{i1} + a_{i2}C_{i2} + a_{i3}C_{i3} + \cdots + a_{in}C_{in} \\
&amp;amp;= \sum_{j=1}^n a_{ij}C_{ij} \\
&amp;amp;= \sum_{j=1}^n a_{ij} (-1)^{i+j} M_{ij} \\
&amp;amp;=
a_{i1} (-1)^{i+1} M_{i1} + a_{i2} (-1)^{i+2} M_{i2} \\
&amp;amp; + a_{i3} (-1)^{i+3} M_{i3} + \cdots + a_{in} (-1)^{i+n} M_{in}
\end{align} \]&lt;/div&gt;
&lt;p&gt;ラプラス展開のために任意の列\( a_{1j}, a_{2j},\cdots, a_{nj} \)を選ぶ場合は次のとおり。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
|A_n| &amp;amp;= a_{1j}C_{1j} + a_{2j}C_{2j} + a_{3j}C_{3j} + \cdots + a_{nj}C_{nj} \\
&amp;amp;= \sum_{i=1}^n a_{ij}C_{ij} \\
&amp;amp;= \sum_{i=1}^n a_{ij} (-1)^{i+j} M_{ij} \\
&amp;amp;=
a_{1j} (-1)^{1+j} M_{1j} + a_{2j} (-1)^{2+j} M_{2j} \\
&amp;amp; + a_{3j} (-1)^{3+j} M_{3j} + \cdots + a_{nj} (-1)^{n+j} M_{nj}
\end{align} \]&lt;/div&gt;
&lt;p&gt;n次の正方行列の特定の行、もしくは特定の列を任意に選び、選んだ行ないし列の各成分とその小行列式と余因子とを掛け合わせ、そうして求めた各々の項をすべて合計する総和が、その正方行列の行列式と等しくなる。そしてその値はスカラー。&lt;/p&gt;
&lt;p&gt;ラプラス展開では、行を選んでも列を選んでもその結果は等しいことが証明されている。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[  \sum_{j=1}^n a_{ij}C_{ij}
= \sum_{i=1}^n a_{ij}C_{ij} \hspace{1cm} \]&lt;/div&gt;
&lt;h4&gt;2次の正方行列のラプラス展開（？）&lt;/h4&gt;
&lt;p&gt;次のような2次正方行列があるとする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A_2 = \begin{pmatrix}
a &amp;amp; b \\ c &amp;amp; d
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;これをラプラス展開してみる。例えばこの正方行列の1行目を選んでラプラス展開する場合は次のとおり。&lt;/p&gt;
&lt;p&gt;aと同じ行と列にある成分を全て取り除き、残ったdがaについての小行列式。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
\cancel{\colorbox{yellow}{\( a \)}} &amp;amp; \cancel{b} \\ \cancel{c} &amp;amp; d
\end{pmatrix} \rightarrow |d| \]&lt;/div&gt;
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class=&quot;minor&quot;&gt;d&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;bと同じ行と列にある成分を全て取り除き、残ったcがbについての小行列式。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
\cancel{a} &amp;amp; \cancel{\colorbox{yellow}{\( b \)}} \\ c &amp;amp; \cancel{d}
\end{pmatrix} \rightarrow |c| \]&lt;/div&gt;
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;minor&quot;&gt;c&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;2行目を選んでラプラス展開する場合は次のとおり。&lt;/p&gt;
&lt;p&gt;cが属す行と列の成分を全て取り除き、残ったbがcについての小行列式。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
\cancel{a} &amp;amp; b \\ \cancel{\colorbox{yellow}{\( c \)}} &amp;amp; \cancel{d}
\end{pmatrix} \rightarrow |b| \]&lt;/div&gt;
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td class=&quot;minor&quot;&gt;b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;dが属す行と列の成分を全て取り除き、残ったaがdについての小行列式。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
a &amp;amp; \cancel{b} \\ \cancel{c} &amp;amp; \cancel{\colorbox{yellow}{\( d \)}}
\end{pmatrix} \rightarrow |a| \]&lt;/div&gt;
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td class=&quot;minor&quot;&gt;a&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;ラプラス展開によって得られた小行列式に符号を適用して余因子を作る。この処理では1か-1を小行列式に交互に掛ける。1を掛けるか-1を掛けるかは、\( (-1)^{i + j} \)（iは列番号、jは行番号）によって決まる。列を選んだ場合にも同じ理屈が成り立つ。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{eqnarray}
(-1)^{1+1} \cdot |d| &amp;amp;=&amp;amp; 1 \cdot |d| &amp;amp;=&amp;amp; |d| \\\\
(-1)^{1+2} \cdot |c| &amp;amp;=&amp;amp; -1 \cdot |c| &amp;amp;=&amp;amp; -|c| \\\\
(-1)^{2+2} \cdot |b| &amp;amp;=&amp;amp; -1 \cdot |b| &amp;amp;=&amp;amp; -|b| \\\\
(-1)^{2+1} \cdot |a| &amp;amp;=&amp;amp; 1 \cdot |a| &amp;amp;=&amp;amp; |a| 
\end{eqnarray} \]&lt;/div&gt;
&lt;p&gt;正方行列\( A_2 \)の行列式は次のように計算される。成分aとその余因子dを掛け、成分bとその余因子-cを掛け、そしてそれらを足し合わせる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
det(A_2) = |A_2| &amp;amp;= a \cdot (+d) + b \cdot (-c) \\
&amp;amp;= ad + (-bc) \\
&amp;amp;= ad - bc
\end{align} \]&lt;/div&gt;
&lt;p&gt;あるいは、成分cとその余因子-bを掛け、成分dとその余因子aを掛け、そしてそれらを足し合わせる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;
\[ \begin{align}
det(A_2) = |A_2| &amp;amp;= c \cdot (-b) + d \cdot a \\
&amp;amp;= -(bc) + ad \\
&amp;amp;= ad - bc
\end{align} \]&lt;/div&gt;
&lt;h4&gt;サラスのルール（3次正方行列限定）&lt;/h4&gt;
&lt;p&gt;行列式を求めるやり方にはラプラス展開を用いること以外にも、連立方程式で用いられるガウスの消去法（掃き出し法）など、様々な方法が開発されている。ガウスの消去法についてはまた別の機会に。&lt;/p&gt;
&lt;p&gt;ここで取り上げるのは、3次の正方行列限定の方法として知られているサラスのルール。これはバスケット織りのメソッドという別名を持っている。たすき掛け法もこれとほぼ同様のやり方。&lt;/p&gt;
&lt;p&gt;例えば次のような3次正方行列があるとする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A_3 = \begin{pmatrix} -2 &amp;amp; 5 &amp;amp; 10 \\
12 &amp;amp; 7 &amp;amp; -11 \\ 3 &amp;amp; -6 &amp;amp; 15 \end{pmatrix} \]&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;この正方行列の左から2列をこの正方行列の右に追加して拡張する。次のように。
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td class=&quot;added_row&quot;&gt;-2&lt;/td&gt;
&lt;td class=&quot;added_row&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;-11&lt;/td&gt;
&lt;td class=&quot;added_row&quot;&gt;12&lt;/td&gt;
&lt;td class=&quot;added_row&quot;&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td class=&quot;added_row&quot;&gt;3&lt;/td&gt;
&lt;td class=&quot;added_row&quot;&gt;-6&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/li&gt;
&lt;li&gt;-2から斜め右下の15へ向けて対角線上に並んでいる数を掛け算する。この掛け算は行列同士の掛け算ではなく可換性の通常の掛け算のこと。
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td class=&quot;right_diagonal&quot;&gt;-2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td class=&quot;right_diagonal&quot;&gt;7&lt;/td&gt;
&lt;td&gt;-11&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;td class=&quot;right_diagonal&quot;&gt;15&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;math&quot;&gt;\[ -2 \cdot 7 \cdot 15 = -210 \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;5から斜め右下の3へ向けて対角線上に並んでいる数を掛け算する。
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td class=&quot;right_diagonal&quot;&gt;5&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td class=&quot;right_diagonal&quot;&gt;-11&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td class=&quot;right_diagonal&quot;&gt;3&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;math&quot;&gt;\[ 5 \cdot -11 \cdot 3 = -165 \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;10から斜め右下の-6へ向けて対角線上に並んでいる数を掛け算する。
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td class=&quot;right_diagonal&quot;&gt;10&lt;/td&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;-11&lt;/td&gt;
&lt;td class=&quot;right_diagonal&quot;&gt;12&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td class=&quot;right_diagonal&quot;&gt;-6&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;math&quot;&gt;\[ 10 \cdot 12 \cdot -6 = -720 \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;左上から右下への対角線上の数を掛け算することによって得られた積を足し算で繋ぐ。
&lt;div class=&quot;math&quot;&gt;\[ -210 + (-165) + (-720) \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;今度は逆方向。左下の3から斜め右上の10に向けて対角線上に並んでいる数を掛け算する。
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td class=&quot;left_diagonal&quot;&gt;10&lt;/td&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td class=&quot;left_diagonal&quot;&gt;7&lt;/td&gt;
&lt;td&gt;-11&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=&quot;left_diagonal&quot;&gt;3&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;math&quot;&gt;\[ 3 \cdot 7 \cdot 10 = 210 \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;-6から斜め右上の-2へ向けて対角線上に並んでいる数を掛け算する。
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td class=&quot;left_diagonal&quot;&gt;-2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td class=&quot;left_diagonal&quot;&gt;-11&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td class=&quot;left_diagonal&quot;&gt;-6&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;math&quot;&gt;\[ -6 \cdot -11 \cdot -2 = -132 \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;15から斜め右上の5まで対角線上に並んでいる数を掛け算する。
&lt;table class=&quot;center&quot;&gt;
&lt;tr&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;-2&lt;/td&gt;
&lt;td class=&quot;left_diagonal&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;-11&lt;/td&gt;
&lt;td class=&quot;left_diagonal&quot;&gt;12&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;td class=&quot;left_diagonal&quot;&gt;15&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;-6&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;math&quot;&gt;\[ 15 \cdot 12 \cdot 5 = 900 \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;左下から右上へ（右上から左下へでもいい）の対角線上の数を掛け算して得られた積を今度は引き算で繋ぐ。
&lt;div class=&quot;math&quot;&gt;\[ 210 - (-132) - 900 \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;足し算で繋いだ式と引き算で繋いだ式とを引き算で繋ぎ合わせる。その際に足し算で繋いだ式が前に来る。こうして最終的な行列式が得られる。
&lt;div class=&quot;math&quot;&gt;\[ |A_3| = -210 + (-165) + (-720) - 210 - (-132) - 900 \]&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;この行列式を計算してみると、-2073というスカラーが得られた。ラプラス展開によって求めた場合と同じ数になることが分かる。&lt;/p&gt;
&lt;h4&gt;逆行列を求める&lt;/h4&gt;
&lt;p&gt;正方行列からその逆行列を見つけるにはどうするのか。&lt;/p&gt;
&lt;p&gt;例えばAという2次正方行列があったとする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A = \begin{pmatrix} a &amp;amp; b \\ c &amp;amp; d \end{pmatrix} \]
&lt;/div&gt;
&lt;p&gt;Aの逆行列は\( A^{-1} \)と記すのが慣例。\( A^{-1} \)は次のような式によって表すことができる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
A^{-1} &amp;amp;=
\begin{pmatrix} a &amp;amp; b \\ c &amp;amp; d \end{pmatrix}^{-1} \\
&amp;amp;= \dfrac{1}{ad - bc}
\begin{pmatrix} d &amp;amp; -b \\ -c &amp;amp; a \end{pmatrix} \\
&amp;amp;= \begin{pmatrix}
\dfrac{d}{ad-bc} &amp;amp; -\dfrac{b}{ad-bc} \\
-\dfrac{c}{ad-bc} &amp;amp; \dfrac{a}{ad-bc} \end{pmatrix}
\end{align} \]&lt;/div&gt;
&lt;p&gt;分数のところの分母の\( ad - bc \)の部分がこの2次正方行列Aの行列式。そしてその分数の右の行列の部分はaとdとが置き換わり、bとcの符号が反転していることが見て取れる。この行列の部分は（&lt;ruby&gt;&lt;rb&gt;転置&lt;/rb&gt;&lt;rt&gt;てんち&lt;/rt&gt;&lt;/ruby&gt;された）余因子行列と呼ばれ、adj\ Aやadj(A)と書かれることがある。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A^{-1} = \dfrac{1}{det\ A} adj\ A \]&lt;/div&gt;
&lt;p&gt;上の式は、Aの逆行列がAの（転置された）余因子行列をAの行列式で割ったものに等しいことを意味している。割り算が逆数による掛け算でもあることを思い出して。&lt;/p&gt;
&lt;p&gt;これを先程の方程式に代入すると次のような関係式が完成する。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
\begin{pmatrix} a &amp;amp; b \\ c &amp;amp; d \end{pmatrix}
\left( \dfrac{1}{ad - bc}
\begin{pmatrix} d &amp;amp; -b \\ -c &amp;amp; a \end{pmatrix} \right)
&amp;amp;= \begin{pmatrix} 1 &amp;amp; 0 \\ 0 &amp;amp; 1 \end{pmatrix}
\end{align} \]
\[ \begin{align}
\left( \dfrac{1}{ad - bc}
\begin{pmatrix} d &amp;amp; -b \\ -c &amp;amp; a \end{pmatrix} \right)
\begin{pmatrix} a &amp;amp; b \\ c &amp;amp; d \end{pmatrix}
&amp;amp;= \begin{pmatrix} 1 &amp;amp; 0 \\ 0 &amp;amp; 1 \end{pmatrix}
\end{align} \]
\[ ただし ad - bc \neq 0  \]&lt;/div&gt;
&lt;p&gt;正方行列にその逆行列を掛ければ単位行列が得られることをこの関係式は意味している。この関係式は逆行列にその正方行列を掛けても成り立つ。&lt;/p&gt;
&lt;p&gt;ただし、行列式が\( ad - bc = 0 \)のときにはこの関係式が成り立たないことに要注意。その場合、その正方行列には逆行列が存在しないことを意味している。&lt;/p&gt;
&lt;div class=&quot;note&quot;&gt;逆行列の定理：正方行列はその行列式の解が0以外の場合だけその逆行列を持つ。&lt;/div&gt;
&lt;p&gt;逆行列を持つ正方行列は&lt;ruby&gt;&lt;rb&gt;可逆&lt;/rb&gt;&lt;rt&gt;かぎゃく&lt;/rt&gt;&lt;/ruby&gt;であると言い、逆行列を持っていない正方行列は&lt;ruby&gt;&lt;rb&gt;特異&lt;/rb&gt;&lt;rt&gt;とくい&lt;/rt&gt;&lt;/ruby&gt;であると言う。正方行列以外の行列は逆行列を持っていない。逆行列を持っている正方行列は特に&lt;ruby&gt;&lt;rb&gt;正則&lt;/rb&gt;&lt;rt&gt;せいそく&lt;/rt&gt;&lt;/ruby&gt;行列と呼ばれている。&lt;/p&gt;
&lt;p&gt;正則行列Aの逆行列がAの（転置された）余因子行列をAの行列式で割ったものに等しいことを示した先ほどの関係式に、実際の正則行列の各成分を代入してやれば、その正則行列の逆行列が得られることになる。&lt;/p&gt;
&lt;p&gt;具体例を挙げてみる。次のような2次正方行列があったとする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[
A = \begin{pmatrix} 8 &amp;amp; 5 \\ 3 &amp;amp; 2\end{pmatrix}
\]&lt;/div&gt;
&lt;p&gt;この正方行列の成分を逆行列に変換すると次のようになるはず。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[
A^{-1} = \dfrac{1}{8 \cdot 2 - 5 \cdot 3}  \cdot
\begin{pmatrix} 2 &amp;amp; -5 \\ -3 &amp;amp; 8 \end{pmatrix}
\]&lt;/div&gt;
&lt;p&gt;これが正しいかどうかは、正則行列とその逆行列とを掛け算し、その答えが単位行列になるかどうかを確かめることで分かるはず。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
A \cdot A^{-1} &amp;amp;=
\begin{pmatrix} 8 &amp;amp; 5 \\ 3 &amp;amp; 2\end{pmatrix} \cdot
\left( \dfrac{1}{8 \cdot 2 - 5 \cdot 3}  \cdot
\begin{pmatrix} 2 &amp;amp; -5 \\ -3 &amp;amp; 8 \end{pmatrix} \right) \\
&amp;amp;= \begin{pmatrix} 8 &amp;amp; 5 \\ 3 &amp;amp; 2\end{pmatrix} \cdot
\left( \dfrac{1}{16 - 15}  \cdot
\begin{pmatrix} 2 &amp;amp; -5 \\ -3 &amp;amp; 8 \end{pmatrix} \right) \\
&amp;amp;= \begin{pmatrix} 8 &amp;amp; 5 \\ 3 &amp;amp; 2\end{pmatrix} \cdot
\left( \dfrac{1}{1}  \cdot
\begin{pmatrix} 2 &amp;amp; -5 \\ -3 &amp;amp; 8 \end{pmatrix} \right) \\
&amp;amp;= \begin{pmatrix} 8 &amp;amp; 5 \\ 3 &amp;amp; 2\end{pmatrix} \cdot
\left( 1 \cdot
\begin{pmatrix} 2 &amp;amp; -5 \\ -3 &amp;amp; 8 \end{pmatrix} \right) \\
&amp;amp;= \begin{pmatrix} 8 &amp;amp; 5 \\ 3 &amp;amp; 2\end{pmatrix} \cdot
\begin{pmatrix} 1 \cdot 2 &amp;amp; 1 \cdot -5 \\
1 \cdot -3 &amp;amp; 1 \cdot 8 \end{pmatrix} \\
&amp;amp;= \begin{pmatrix} 8 &amp;amp; 5 \\ 3 &amp;amp; 2\end{pmatrix} \cdot
\begin{pmatrix} 2 &amp;amp; -5 \\ -3 &amp;amp; 8 \end{pmatrix} \\
&amp;amp;= \begin{pmatrix}
8 \cdot 2 + 5 \cdot (-3) &amp;amp; 8 \cdot (-5) + 5 \cdot 8 \\
3 \cdot 2 + 2 \cdot (-3) &amp;amp; 3 \cdot (-5) + 2 \cdot 8
\end{pmatrix} \\
&amp;amp;= \begin{pmatrix}
16 + (-15) &amp;amp; (-40) + 40 \\
6 + (-6) &amp;amp; (-15) + 16
\end{pmatrix} \\
&amp;amp;= \begin{pmatrix}1 &amp;amp; 0 \\ 0 &amp;amp; 1 \end{pmatrix}
\end{align} \]&lt;/div&gt;
&lt;p&gt;行列の掛け算では交換法則が成り立たないので、正方行列とその逆行列を交換しても単位行列が得られるかどうかを確かめてみる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
A^{-1} \cdot A &amp;amp;=
\begin{pmatrix} 2 &amp;amp; -5 \\ -3 &amp;amp; 8 \end{pmatrix} \cdot
\begin{pmatrix} 8 &amp;amp; 5 \\ 3 &amp;amp; 2\end{pmatrix} \\
&amp;amp;=
\begin{pmatrix} 2 \cdot 8 + (-5) \cdot 3 &amp;amp; 2 \cdot 5 + (-5) \cdot 2 \\
(-3) \cdot 8 + 8 \cdot 3 &amp;amp; (-3) \cdot 5 + 8 \cdot 2 \end{pmatrix} \\
&amp;amp;=
\begin{pmatrix} 16 + (-15) &amp;amp; 10 + (-10) \\
(-24) + 24 &amp;amp; (-15) + 16 \end{pmatrix} \\
&amp;amp;=
\begin{pmatrix} 1 &amp;amp; 0 \\ 0 &amp;amp; 1 \end{pmatrix}
\end{align} \]&lt;/div&gt;
&lt;p&gt;いずれの場合も単位行列を得ることができた。&lt;/p&gt;
&lt;p&gt;Maximanによって確かめてみる。Maximaで逆行列を得るにはinvert()函数を用いるか、Aが正則行列ならばA^^(-1);と入力する。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ maxima
Maxima 5.42.1 http://maxima.sourceforge.net
（中略）
(%i1) A: matrix([8,5],[3,2]);
                                   [ 8  5 ]
(%o1)                              [      ]
                                   [ 3  2 ]
(%i2) B: invert(A);
                                 [  2   - 5 ]
(%o2)                            [          ]
                                 [ - 3   8  ]
(%i3) A.B;
                                   [ 1  0 ]
(%o3)                              [      ]
                                   [ 0  1 ]
(%i4) B.A;
                                   [ 1  0 ]
(%o4)                              [      ]
                                   [ 0  1 ]
(%i5) quit();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;いずれも単位行列を得ることができた。&lt;/p&gt;
&lt;p&gt;行列同士の乗法では交換法則が成り立たないので、Maximaを使って行列同士の掛け算を行うには非可換乗算演算子であるドット（.）演算子を用いる必要がある。乗算演算子としてアスタリスク（*）を用いると誤った結果を得るので要注意。&lt;/p&gt;
&lt;p&gt;Juliaで逆行列を得るにはinv()函数を用いることができる。Juliaでは行列同士の掛け算にアスタリスク(*)を用いる必要がある。ドット(.)を用いると文法エラーが生じてしまう。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type &quot;?&quot; for help, &quot;]?&quot; for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.3
 _/ |\__&#39;_|_|_|\__&#39;_|  |  Debian ⛬  julia/1.0.3+dfsg-4
|__/                   |

julia&amp;gt; A = [8 5; 3 2]
2×2 Array{Int64,2}:
 8  5
 3  2

julia&amp;gt; B = inv(A)
2×2 Array{Float64,2}:
  2.0  -5.0
 -3.0   8.0

julia&amp;gt; A * B
2×2 Array{Float64,2}:
 1.0  0.0
 0.0  1.0

julia&amp;gt; B * A
2×2 Array{Float64,2}:
 1.0  0.0
 0.0  1.0

julia&amp;gt; exit()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Juliaでdet()函数を使うにはusing LinearAlgebraの指定が必要だが、inv()函数ではなぜかそれが不要。&lt;/p&gt;
&lt;p&gt;Python3ではNumpyをインポートしてnumpy.linalg.inv()函数を用いることで逆行列を作成できる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ python3
Python 3.7.3
（中略）
&amp;gt;&amp;gt;&amp;gt; import numpy as np
&amp;gt;&amp;gt;&amp;gt; A = np.matrix(&#39;8,5;3,2&#39;)
&amp;gt;&amp;gt;&amp;gt; print(A)
[[8 5]
 [3 2]]
&amp;gt;&amp;gt;&amp;gt; B = np.linalg.inv(A)
&amp;gt;&amp;gt;&amp;gt; print(B)
[[ 2. -5.]
 [-3.  8.]]
&amp;gt;&amp;gt;&amp;gt; print(A @ B)
[[1. 0.]
 [0. 1.]]
&amp;gt;&amp;gt;&amp;gt; print(B @ A)
&amp;gt;&amp;gt;&amp;gt; quit()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Python3の場合、行列同士の掛け算にはアットマーク(@)演算子を用いる。&lt;/p&gt;
&lt;h4&gt;逆行列を見つけるアルゴリズム&lt;/h4&gt;
&lt;p&gt;具体例をもう一つ挙げてみる。今度は3次の正方行列。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A_3 =
\begin{pmatrix} -2 &amp;amp; 0 &amp;amp; -5 \\ 4 &amp;amp; -6 &amp;amp; 2 \\ -1 &amp;amp; 1 &amp;amp; 3 \end{pmatrix} \]&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;ラプラス展開によって正方行列の全ての成分について各々の小行列式を求め、それらの小行列式の計算結果から小行列式の行列を作る。
&lt;div class=&quot;math&quot;&gt;\[ minor(A_3) = M = \begin{pmatrix}
M_{11} &amp;amp; M_{12} &amp;amp; M_{13} \\
M_{21} &amp;amp; M_{22} &amp;amp; M_{23} \\
M_{31} &amp;amp; M_{32} &amp;amp; M_{33}
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;\( M_{ij} \)は行列\( A_3 \)の各成分である\( a_{ij} \)をラプラス展開して得られた小行列式、そしてその計算結果であるスカラー。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
M_{11} &amp;amp;=
\begin{vmatrix} -6 &amp;amp; 2 \\ 1 &amp;amp; 3 \end{vmatrix} \\
&amp;amp;= -6 \cdot 3 - 2 \cdot 1 \\
&amp;amp;= -18 -  2 \\
&amp;amp;= -20 \\\\
M_{12} &amp;amp;=
\begin{vmatrix} 4 &amp;amp; 2 \\ -1 &amp;amp; 3 \end{vmatrix} \\
&amp;amp;= 4 \cdot 3 - 2 \cdot -1 \\
&amp;amp;= 12 - (-2) = 12 + 2 \\
&amp;amp;= 14 \\\\
M_{13} &amp;amp;=
\begin{vmatrix} 4 &amp;amp; -6 \\ -1 &amp;amp; 1 \end{vmatrix} \\
&amp;amp;= 4 \cdot 1 - (-6) \cdot -1 \\
&amp;amp;= 4 - 6 \\
&amp;amp;= -2 \\\\
M_{21} &amp;amp;=
\begin{vmatrix} 0 &amp;amp; -5 \\ 1 &amp;amp; 3 \end{vmatrix} \\
&amp;amp;= 0 \cdot 3 - (-5) \cdot 1 \\
&amp;amp;= 0 - (-5) = 0 + 5 \\
&amp;amp;= 5 \\\\
M_{22} &amp;amp;=
\begin{vmatrix} -2 &amp;amp; -5 \\ -1 &amp;amp; 3 \end{vmatrix} \\
&amp;amp;= -2 \cdot 3 - (-5) \cdot -1 \\
&amp;amp;= -6 - 5 \\
&amp;amp;= -11 \\\\
M_{23} &amp;amp;=
\begin{vmatrix} -2 &amp;amp; 0 \\ -1 &amp;amp; 1 \end{vmatrix} \\
&amp;amp;= -2 \cdot 1 - 0 \cdot -1 \\
&amp;amp;= -2 \\\\
M_{31} &amp;amp;=
\begin{vmatrix} 0 &amp;amp; -5 \\ -6 &amp;amp; 2 \end{vmatrix} \\
&amp;amp;= 0 \cdot 2 - (-5) \cdot -6 \\
&amp;amp;= 0 - 30 \\
&amp;amp;= -30 \\\\
M_{32} &amp;amp;=
\begin{vmatrix} -2 &amp;amp; -5 \\ 4 &amp;amp; 2 \end{vmatrix} \\
&amp;amp;= -2 \cdot 2 - (-5) \cdot 4 \\
&amp;amp;= -4 - (-20) = -4 + 20 \\
&amp;amp;= 16 \\\\
M_{33} &amp;amp;=
\begin{vmatrix} -2 &amp;amp; 0 \\ 4 &amp;amp; -6 \end{vmatrix} \\
&amp;amp;= -2 \cdot -6 - 0 \cdot 4 \\
&amp;amp;= 12
\end{align} \]&lt;/div&gt;
&lt;p&gt;これらの小行列式の計算結果から得られたスカラーから、次のような行列を作ることができる。これが小行列式の行列。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ minor(A_3) = M = \begin{pmatrix}
-20 &amp;amp; 14 &amp;amp; -2 \\
5 &amp;amp; -11 &amp;amp; -2 \\
-30 &amp;amp; 16 &amp;amp; 12 \end{pmatrix} \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;小行列式の行列に対して正負の符号を規則どおりに適用して余因子行列を作る。
&lt;p&gt;正負の符号は\( M_{11} \)が正になるところから始まり、行列の最後の成分\( M_{nn} \)まで正負正負の順番で互い違いに適用される。&lt;/p&gt;
&lt;p&gt;このことは小行列式の行列を構成する各々のスカラーに対して1と-1を交互に掛けてゆく処理と等しい。このような掛け算はアダマール積と呼ばれることがある。行列同士の通常の掛け算と異なるので要注意。アダマール積の演算子は\( \circ \)か\( \odot \)。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
cof(A_3) = C &amp;amp;=
\begin{pmatrix}
-20 &amp;amp; 14 &amp;amp; -2 \\ 5 &amp;amp; -11 &amp;amp; -2 \\ -30 &amp;amp; 16 &amp;amp; 12
\end{pmatrix}
\circ
\begin{pmatrix}
1 &amp;amp; -1 &amp;amp; 1 \\ -1 &amp;amp; 1 &amp;amp; -1 \\ 1 &amp;amp; -1 &amp;amp; 1 
\end{pmatrix} \\\\
&amp;amp;=
\begin{pmatrix}
-20 \cdot 1 &amp;amp; 14 \cdot -1 &amp;amp; -2 \cdot 1 \\
5 \cdot -1 &amp;amp; -11 \cdot 1 &amp;amp; -2 \cdot -1 \\
-30 \cdot 1 &amp;amp; 16 \cdot -1 &amp;amp; 12 \cdot 1
\end{pmatrix} \\\\
&amp;amp;=
\begin{pmatrix}
-20 &amp;amp; -14 &amp;amp; -2 \\ -5 &amp;amp; -11 &amp;amp; 2 \\ -30 &amp;amp; -16 &amp;amp; 12
\end{pmatrix}
\end{align} \]&lt;/div&gt;
&lt;p&gt;こうして得られた行列は余因子行列と呼ばれているもの。英語ではa cofactor matrixのこと。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;その余因子行列を&lt;ruby&gt;&lt;rb&gt;転置&lt;/rb&gt;&lt;rt&gt;てんち&lt;/rt&gt;&lt;/ruby&gt;して余因子行列の転置行列を作る。これは\( adj\ A \)とかadj(A)とか\( C^T \)などと表される。
&lt;div class=&quot;math&quot;&gt;\[ adj(A_3) = C^T = (-1)^{i+j} M_{ji} \]&lt;/div&gt;
&lt;p&gt;転置とは列(i)と行(j)とを次のように交替させること。つまり\( C_{ij} \rightarrow C_{ji} \)にする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ C = \begin{pmatrix}
\colorbox{yellow}{-20} &amp;amp; \colorbox{yellow}{-15} &amp;amp; \colorbox{yellow}{-2} \\
\colorbox{cyan}{-5} &amp;amp; \colorbox{cyan}{-11} &amp;amp; \colorbox{cyan}{2} \\
\colorbox{pink}{-30} &amp;amp; \colorbox{pink}{-16} &amp;amp; \colorbox{pink}{12}
\end{pmatrix}
\rightarrow
C^T = \begin{pmatrix}
\colorbox{yellow}{-20} &amp;amp; \colorbox{cyan}{-5} &amp;amp; \colorbox{pink}{-30} \\
\colorbox{yellow}{-15} &amp;amp; \colorbox{cyan}{-11} &amp;amp; \colorbox{pink}{-16} \\
\colorbox{yellow}{-2} &amp;amp; \colorbox{cyan}{2} &amp;amp; \colorbox{pink}{12}
\end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;a cofactor matrixを転置した行列も実は余因子行列と呼ばれている。転置された余因子行列は英語ではan adjugate matrixなので、adjはその略記。&lt;/p&gt;
&lt;p&gt;以下、転置された余因子行列のことをここでは転置余因子行列と呼ぶことにする。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;行列\( A_3 \)をラプラス展開して行列式を計算する。
&lt;p&gt;この計算は、例えば元の行列の一行目の成分\( a_{11}\ a_{12}\ a_{13} \)とそれと同じ位置にある余因子行列の成分\( C_{11}\ C_{12}\ C_{13} \)とを利用し、次のように簡単に行うことができる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A_3 = \begin{pmatrix}
\colorbox{yellow} {-2} &amp;amp; \colorbox{yellow}{0} &amp;amp; \colorbox{yellow}{-5} \\ 4 &amp;amp; -6 &amp;amp; 2 \\ -1 &amp;amp; 1 &amp;amp; 3 \end{pmatrix} \]
\[ C = \begin{pmatrix}
\colorbox{yellow}{-20} &amp;amp; \colorbox{yellow}{-14} &amp;amp; \colorbox{yellow}{-2} \\ -5 &amp;amp; -11 &amp;amp; 2 \\ -30 &amp;amp; -16 &amp;amp; 12
\end{pmatrix} \]&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
|A_3| &amp;amp;= a_{11}C_{11} + a_{12}C_{12} + a_{13}C_{13} \\
&amp;amp;= -2 \cdot -20 + 0 \cdot -14 + (-5) \cdot -2  \\
&amp;amp;= 40 + 0 + 10 \\
&amp;amp;= 50 \end{align} \]&lt;/div&gt;
&lt;p&gt;2列目を選んだ場合は次のように計算できる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A_3 = \begin{pmatrix}
-2 &amp;amp; \colorbox{yellow}{0} &amp;amp; -5 \\ 4 &amp;amp; \colorbox{yellow}{-6} &amp;amp; 2 \\ -1 &amp;amp; \colorbox{yellow}{1} &amp;amp; 3 \end{pmatrix} \]
\[ C = \begin{pmatrix}
-20 &amp;amp; \colorbox{yellow}{-14} &amp;amp; -2 \\ -5 &amp;amp; \colorbox{yellow}{-11} &amp;amp; 2 \\ -30 &amp;amp; \colorbox{yellow}{-16} &amp;amp; 12
\end{pmatrix} \]&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
|A_3| &amp;amp;= a_{12}C_{12} + a_{22}C_{22} + a_{32}C_{32} \\
&amp;amp;= 0 \cdot -14 + -6 \cdot -11 + 1 \cdot -16  \\
&amp;amp;= 0 + 66 + (-16) = 0 + 66 - 16 \\
&amp;amp;= 50 \end{align} \]&lt;/div&gt;
&lt;p&gt;どの行、またはどの列を選んでも、その成分を合計すれば、50というスカラーが得られるはず。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;3.で得られた転置余因子行列と4.で得られた行列式のスカラーによって逆行列が次のとおりに定まる。
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
A_3^{-1} &amp;amp;= \dfrac{1}{50} \cdot
\begin{pmatrix}
-20 &amp;amp; -5 &amp;amp; -30 \\
-14 &amp;amp; -11 &amp;amp; -16 \\
-2 &amp;amp; 2 &amp;amp; 12
\end{pmatrix} \\\\
&amp;amp;= \begin{pmatrix}
-\dfrac{20}{50} &amp;amp; -\dfrac{5}{50} &amp;amp; -\dfrac{30}{50} \\
-\dfrac{14}{50} &amp;amp; -\dfrac{11}{50} &amp;amp; -\dfrac{16}{50} \\
-\dfrac{2}{50} &amp;amp; \dfrac{2}{50} &amp;amp; \dfrac{12}{50}
\end{pmatrix} \\\\
&amp;amp;= \begin{pmatrix}
-\dfrac{2}{5} &amp;amp; -\dfrac{1}{10} &amp;amp; -\dfrac{3}{5} \\
-\dfrac{7}{25} &amp;amp; -\dfrac{11}{50} &amp;amp; -\dfrac{8}{25} \\
-\dfrac{1}{25} &amp;amp; \dfrac{1}{25} &amp;amp; \dfrac{6}{25}
\end{pmatrix}
\end{align} \]&lt;/div&gt;
&lt;p&gt;約分しているがしなくてもいい。正則行列の逆行列がその正則行列の転置余因子行列をその正則行列の行列式で割ったものであることが見て取れる。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;元の正則行列と逆行列との掛け算をして単位行列が得られるかどうかを確認してみる。
&lt;p&gt;この掛け算は行列同士の通常どおりの非可換性の乗法に従う。というわけで行列同士の掛け算では交換法則が通常は成り立たない。しかし、逆行列であることを確認するためには、掛けられる行列と掛ける行列を置き換えても単位行列が得られる必要があることに要注意。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
\begin{pmatrix} -2 &amp;amp; 0 &amp;amp; -5 \\ 4 &amp;amp; -6 &amp;amp; 2 \\ -1 &amp;amp; 1 &amp;amp; 3 \end{pmatrix}
\cdot
 \begin{pmatrix}
-\dfrac{2}{5} &amp;amp; -\dfrac{1}{10} &amp;amp; -\dfrac{3}{5} \\
-\dfrac{7}{25} &amp;amp; -\dfrac{11}{50} &amp;amp; -\dfrac{8}{25} \\
-\dfrac{1}{25} &amp;amp; \dfrac{1}{25} &amp;amp; \dfrac{6}{25}
\end{pmatrix}
&amp;amp;=
\begin{pmatrix} 1 &amp;amp; 0 &amp;amp; 0 \\ 0 &amp;amp; 1 &amp;amp; 0 \\ 0 &amp;amp; 0 &amp;amp; 1 \end{pmatrix}
\end{align} \]
\[ \begin{align}
 \begin{pmatrix}
-\dfrac{2}{5} &amp;amp; -\dfrac{1}{10} &amp;amp; -\dfrac{3}{5} \\
-\dfrac{7}{25} &amp;amp; -\dfrac{11}{50} &amp;amp; -\dfrac{8}{25} \\
-\dfrac{1}{25} &amp;amp; \dfrac{1}{25} &amp;amp; \dfrac{6}{25}
\end{pmatrix}
\cdot
\begin{pmatrix} -2 &amp;amp; 0 &amp;amp; -5 \\ 4 &amp;amp; -6 &amp;amp; 2 \\ -1 &amp;amp; 1 &amp;amp; 3 \end{pmatrix}
&amp;amp;=
\begin{pmatrix} 1 &amp;amp; 0 &amp;amp; 0 \\ 0 &amp;amp; 1 &amp;amp; 0 \\ 0 &amp;amp; 0 &amp;amp; 1 \end{pmatrix}
\end{align} \]&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
\end{align} \]&lt;/div&gt;
&lt;p&gt;この計算はやややっかいなのでMaximaに任せよう。&lt;/p&gt;
&lt;p&gt;matrix()函数で行列を作り、invert()函数で逆行列を得る。ドット演算子(.)を用いて非可換性の乗法を行うと、いずれも単位行列が得られることが分かる。コロン(:)はMaximaでは変数への代入演算子。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ maxima
Maxima 5.42.1 http://maxima.sourceforge.net
（中略）
(%i1) A: matrix([-2,0,-5],[4,-6,2],[-1,1,3]);
                               [ - 2   0   - 5 ]
                               [               ]
(%o1)                          [  4   - 6   2  ]
                               [               ]
                               [ - 1   1    3  ]
(%i2) IA: invert(A);
                             [   2     1     3  ]
                             [ - -   - --  - -  ]
                             [   5     10    5  ]
                             [                  ]
                             [   7     11    8  ]
(%o2)                        [ - --  - --  - -- ]
                             [   25    50    25 ]
                             [                  ]
                             [   1    1     6   ]
                             [ - --   --    --  ]
                             [   25   25    25  ]
(%i3) A.IA;
                                  [ 1  0  0 ]
                                  [         ]
(%o3)                             [ 0  1  0 ]
                                  [         ]
                                  [ 0  0  1 ]
(%i4) IA.A;
                                  [ 1  0  0 ]
                                  [         ]
(%o4)                             [ 0  1  0 ]
                                  [         ]
                                  [ 0  0  1 ]
(%i5) quit();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ちなみに、余因子行列の転置行列\( C^T \)をMaximaで得るにはadjoint()函数を用いる。単位行列を作るにはident()函数を用いる。ident()函数の括弧内の引数には次数（n次の正方行列のnの数）を指定する。&lt;/p&gt;
&lt;p&gt;Maximaで小行列式を得るにはminor(正方行列,列番号,行番号)函数を利用できる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ maxima
Maxima 5.42.1 http://maxima.sourceforge.net
（中略）
(%i1) A: matrix([-2,0,5],[4,-6,2],[-1,1,3]);
                                [ - 2   0   5 ]
                                [             ]
(%o1)                           [  4   - 6  2 ]
                                [             ]
                                [ - 1   1   3 ]
(%i2) minor(A,1,1);
                                  [ - 6  2 ]
(%o2)                             [        ]
                                  [  1   3 ]
(%i3) minor(A,1,2);
                                  [  4   2 ]
(%o3)                             [        ]
                                  [ - 1  3 ]
(%i4) minor(A,1,3);
                                 [  4   - 6 ]
(%o4)                            [          ]
                                 [ - 1   1  ]
(%i5) quit();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GNU Octaveではinv()函数を使うと逆行列を生成することができる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ octave
GNU Octave, version 4.4.1
Copyright (C) 2018 John W. Eaton and others.
（中略）
&amp;gt;&amp;gt; A = [-2,0,-5;4,-6,2;-1,1,3]
A =

  -2   0  -5
   4  -6   2
  -1   1   3

&amp;gt;&amp;gt; B = inv(A)
B =

  -0.400000  -0.100000  -0.600000
  -0.280000  -0.220000  -0.320000
  -0.040000   0.040000   0.240000

&amp;gt;&amp;gt; A*B
ans =

   1.00000   0.00000   0.00000
  -0.00000   1.00000  -0.00000
   0.00000   0.00000   1.00000

&amp;gt;&amp;gt; B*A
ans =

   1.00000   0.00000   0.00000
   0.00000   1.00000   0.00000
   0.00000   0.00000   1.00000

&amp;gt;&amp;gt; quit()&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;行列同士の割り算（除法）&lt;/h4&gt;
&lt;p&gt;行列同士の割り算は通常は定義されていないようだ。ただし、スカラー同士の割り算が割る数の逆数を掛けることに等しかったように、行列にもいくつかの条件の下でそのことを応用できる。&lt;/p&gt;
&lt;p&gt;AとBが共に行列であるとき、その割り算を次のように定義できる。\( B^{-1} \)はBという行列の逆行列を意味している。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ A \div B = A \cdot B^{-1} \]&lt;/div&gt;
&lt;p&gt;割られる行列であるAは&lt;ruby&gt;&lt;rb&gt;被除算&lt;/rb&gt;&lt;rt&gt;ひじょさん&lt;/rt&gt;&lt;/ruby&gt;行列、割る行列であるBは&lt;ruby&gt;&lt;rb&gt;除算&lt;/rb&gt;&lt;rt&gt;じょさん&lt;/rt&gt;&lt;/ruby&gt;行列と呼ばれている。&lt;/p&gt;
&lt;p&gt;行列同士の割り算が成り立つためには除算行列がその逆行列を持つ必要があるので、Bは正則行列である必要がある。&lt;/p&gt;
&lt;p&gt;正則行列とは、列数と行数が同じこと、つまり正方行列であることと、その行列式が0でないこと、つまり可逆であることとが共に満たされた行列のこと。&lt;/p&gt;
&lt;p&gt;さらに、AとBの逆行列\( B^{-1} \)が掛け算可能である必要がある。行列同士の通常の掛け算が可能になるのは、Bの次元とAの列の数ないしAの行の数が一致している場合。&lt;/p&gt;
&lt;p&gt;例として2列の行ベクトルと2次の正方行列の割り算を試してみる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
\begin{pmatrix} -1 &amp;amp; 3 \end{pmatrix}
\div
\begin{pmatrix} 1 &amp;amp; 4 \\ -2 &amp;amp; 5 \end{pmatrix}
&amp;amp;=
\begin{pmatrix} -1 &amp;amp; 3 \end{pmatrix}
\cdot
\left( \dfrac{1}{(1 \cdot 5) - (-4 \cdot 2)} \cdot
\begin{pmatrix} 5 &amp;amp; -4 \\ 2 &amp;amp; 1 \end{pmatrix} \right) \\\\
&amp;amp;=
\begin{pmatrix} -1 &amp;amp; 3 \end{pmatrix}
\cdot
\left( \dfrac{1}{5 + 8} \cdot
\begin{pmatrix} 5 &amp;amp; -4 \\ 2 &amp;amp; 1 \end{pmatrix} \right) \\\\
&amp;amp;=
\begin{pmatrix} -1 &amp;amp; 3 \end{pmatrix}
\cdot
\left( \dfrac{1}{13} \cdot
\begin{pmatrix} 5 &amp;amp; -4 \\ 2 &amp;amp; 1 \end{pmatrix} \right) \\\\
&amp;amp;=
\begin{pmatrix} -1 &amp;amp; 3 \end{pmatrix}
\cdot
\begin{pmatrix} \dfrac{5}{13} &amp;amp; -\dfrac{4}{13} \\
\dfrac{2}{13} &amp;amp; \dfrac{1}{13} \end{pmatrix} \\\\
&amp;amp;= \begin{pmatrix}
-1 \cdot \dfrac{5}{13} + 3 \cdot \dfrac{4}{13} &amp;amp;
-1 \cdot -\dfrac{4}{13} + 3 \cdot \dfrac{1}{13} \end{pmatrix} \\\\
&amp;amp;= \begin{pmatrix}
-\dfrac{5}{13} + \dfrac{6}{13} &amp;amp;
\dfrac{4}{13} + \dfrac{3}{13} \end{pmatrix} \\\\
&amp;amp;= \begin{pmatrix}
\dfrac{1}{13} &amp;amp; \dfrac{7}{13} \end{pmatrix}
\end{align} \]&lt;/div&gt;
&lt;p&gt;Juliaを用いて答え合わせ。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ julia
（中略）
julia&amp;gt; A = [-1 3]
1×2 Array{Int64,2}:
 -1  3

julia&amp;gt; B = [1 4; -2 5]
2×2 Array{Int64,2}:
  1  4
 -2  5

julia&amp;gt; invB = inv(B)
2×2 Array{Float64,2}:
 0.384615  -0.307692 
 0.153846   0.0769231

julia&amp;gt; A * invB
1×2 Array{Float64,2}:
 0.0769231  0.538462

julia&amp;gt; 1/13
0.07692307692307693

julia&amp;gt; 7/13
0.5384615384615384

julia&amp;gt; exit()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分数と小数との違いはあるが、ほぼ同じ計算結果が得られた。&lt;/p&gt;
&lt;h4&gt;行列同士の割り算のアルゴリズム&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;割られる行列（被除算行列）と割る行列（除算行列）の行数と列数、列数と行数とが、共に等しいか、あるいはどちらか一方が等しいことを確認する。つまり、行列同士の掛け算が可能かどうかを確かめる。
&lt;p&gt;行列同士の割り算は結局は行列同士の掛け算をする処理になるので、それが成り立つ条件を満たさなければいけない。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix}
\colorbox{yellow}{-1} &amp;amp; \colorbox{yellow}{3} \end{pmatrix}
\div
\begin{pmatrix} \colorbox{yellow}{1} &amp;amp; 4 \\ \colorbox{yellow}{-2} &amp;amp; 5 \end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;これらは行数と列数とが等しいのでその条件を満たしている。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;除算行列の行数と列数とが等しいことを確認。つまり除算行列が正方行列であるという条件を満たすかどうかを見定める。
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix} 1 &amp;amp; 4 \\ -2 &amp;amp; 5 \end{pmatrix} \]&lt;/div&gt;
&lt;p&gt;この除算行列は\( 2 \times 2 \)の正方行列であるのでその条件を満たしている。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;除算行列が正則行列であること、つまりその行列式が0でないこと、すなわち逆行列を持つことを確かめる。そのためには除算行列の行列式を解く。
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
\begin{vmatrix} 1 &amp;amp; 4 \\ -2 &amp;amp; 5 \end{vmatrix}
&amp;amp;= (1 \cdot 5) - (-4 \cdot  2) \\
&amp;amp;= 5 - (-8) \\
&amp;amp;= 5 + 8 \\
&amp;amp;= 13 \end{align} \]&lt;/div&gt;
&lt;p&gt;除算行列の行列式は13。0でないので可逆、つまり逆行列を持つ。正則行列であるという条件を満たしていることが分かる。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;除算行列の転置余因子行列を求める。
&lt;p&gt;2次の場合は簡単。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[
cof \begin{pmatrix} 1 &amp;amp; 4 \\ -2 &amp;amp; 5 \end{pmatrix}
= \begin{pmatrix} 5 &amp;amp; -2 \\ 4 &amp;amp; 1 \end{pmatrix}
\]&lt;/div&gt;
&lt;p&gt;除算行列の成分1の小行列は5、成分4の小行列は-2、成分-2の小行列は4、成分5の小行列は1。&lt;/p&gt;
&lt;p&gt;これにお約束どおりに正負正負という符号を適用する（アダマール積を取る）と次のようになる。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
adj \begin{pmatrix} 1 &amp;amp; 4 \\ -2 &amp;amp; 5 \end{pmatrix}
&amp;amp;= \begin{pmatrix} 5 &amp;amp; -2 \\ 4 &amp;amp; 1 \end{pmatrix}
\circ \begin{pmatrix} 1 &amp;amp; -1 \\ -1 &amp;amp; 1 \end{pmatrix} \\\\
&amp;amp;= \begin{pmatrix} 1 \cdot 5 &amp;amp; -1 \cdot -2 \\ -1 \cdot 4 &amp;amp; 1 \cdot 1 \end{pmatrix} \\\\
&amp;amp;= \begin{pmatrix} 5 &amp;amp; 2 \\ -4 &amp;amp; 1 \end{pmatrix}
\end{align} \]&lt;/div&gt;
&lt;p&gt;これを転置すると転置余因子行列の出来上がり。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix} 5 &amp;amp; 2 \\ -4 &amp;amp; 1 \end{pmatrix}^T
= \begin{pmatrix} 5 &amp;amp; -4 \\ 2 &amp;amp; 1 \end{pmatrix} \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;除算行列の行列式と除算行列の転置余因子行列とを材料にして除算行列の逆行列を作る。
&lt;div class=&quot;math&quot;&gt;\[ \begin{pmatrix} 1 &amp;amp; 4 \\ -2 &amp;amp; 5 \end{pmatrix}^{-1}
= \dfrac{1}{13} \cdot \begin{pmatrix} 5 &amp;amp; -4 \\ 2 &amp;amp; 1 \end{pmatrix}
= \begin{pmatrix} \dfrac{5}{13} &amp;amp; -\dfrac{4}{13} \\
\dfrac{2}{13} &amp;amp; \dfrac{1}{13} \end{pmatrix} \]&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;被除算行列と除算行列の逆行列とで行列同士の通常の乗算、つまり非可換性の掛け算をする。
&lt;div class=&quot;math&quot;&gt;\[ \begin{align}
\begin{pmatrix} -1 &amp;amp; 3 \end{pmatrix}
\cdot
\begin{pmatrix} \dfrac{5}{13} &amp;amp; -\dfrac{4}{13} \\
\dfrac{2}{13} &amp;amp; \dfrac{1}{13} \end{pmatrix}
&amp;amp;= \begin{pmatrix}
-1 \cdot \dfrac{5}{13} + 3 \cdot \dfrac{4}{13} &amp;amp;
-1 \cdot -\dfrac{4}{13} + 3 \cdot \dfrac{1}{13} \end{pmatrix} \\
&amp;amp;= \begin{pmatrix}
-\dfrac{5}{13} + \dfrac{6}{13} &amp;amp;
\dfrac{4}{13} + \dfrac{3}{13} \end{pmatrix} \\
&amp;amp;= \begin{pmatrix}
\dfrac{1}{13} &amp;amp; \dfrac{7}{13} \end{pmatrix}
\end{align} \]&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;コンピュータで答え合わせ。&lt;/p&gt;
&lt;p&gt;GNU Octaveでは次のように計算することができる。det()関数は行列式を出力し、inv()関数は逆行列を出力する。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ octave
GNU Octave, version 4.4.1
（中略）
&amp;gt;&amp;gt; A = [-1,3]
A =

  -1   3

&amp;gt;&amp;gt; B = [1,4;-2,5]
B =

   1   4
  -2   5

&amp;gt;&amp;gt; det(B)
ans =  13
&amp;gt;&amp;gt; B * inv(B)
ans =

   1   0
   0   1

&amp;gt;&amp;gt; inv(B) * B
ans =

   1   0
   0   1

&amp;gt;&amp;gt; A * inv(B)
ans =

   0.076923   0.538462

&amp;gt;&amp;gt; 1 / 13
ans =  0.076923
&amp;gt;&amp;gt; 7 / 13
ans =  0.53846
&amp;gt;&amp;gt; quit()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Maximaでは次のように計算できる。Maximaでは非可換性乗法にはドット演算子を使う。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ maxima
Maxima 5.42.1 http://maxima.sourceforge.net
（中略）
(%i1) A: matrix([-1,3]);
(%o1)                             [ - 1  3 ]
(%i2) B: matrix([1,4],[-2,5]);
                                  [  1   4 ]
(%o2)                             [        ]
                                  [ - 2  5 ]
(%i3) B . invert(B);
                                   [ 1  0 ]
(%o3)                              [      ]
                                   [ 0  1 ]
(%i4) invert(B) . B;
                                   [ 1  0 ]
(%o4)                              [      ]
                                   [ 0  1 ]
(%i5) A . invert(B);
                                  [ 1   7  ]
(%o5)                             [ --  -- ]
                                  [ 13  13 ]
(%i6) float(A . invert(B));
(%o6)             [ 0.07692307692307693  0.5384615384615384 ]
(%i7) quit();&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;fieldset&quot;&gt;
&lt;h3 class=&quot;legend&quot;&gt;まとめ&lt;/h3&gt;
&lt;dl&gt;
&lt;dt&gt;逆数&lt;/dt&gt;
&lt;dd&gt;英語でa multiplicative inverseのこと。aの逆数xは\( x = 1 \div a \)によって得られる。aを分数に直してその分母と分子をひっくり返しても得られる。&lt;/dd&gt;
&lt;dd class=&quot;math&quot;&gt;\[ a = \dfrac{a}{1} \rightarrow \dfrac{1}{a} \]&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;単位元&lt;/dt&gt;
&lt;dd&gt;ある演算システムにおいて他の数を変化させることがない数。中立元とも同一元とも言える数。英語ではan identity elementのこと。足し算では0が単位元。英語ではthe additive identity。掛け算では1が単位元。英語ではthe multiplicative identity。&lt;/dd&gt;
&lt;dd class=&quot;math&quot;&gt;\[ a + 0 = 0 + a = a \]
\[ a \times 1 = 1 \times a = a \]&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;正方行列&lt;/dt&gt;
&lt;dd&gt;列の数と行の数とが等しい行列。正方形のような形をしている。英語ではa square matrix。&lt;/dd&gt;
&lt;dd class=&quot;math&quot;&gt;\[ A = \begin{pmatrix}
a_{11} &amp;amp; a_{12} &amp;amp; \cdots &amp;amp; a_{1n} \\
a_{21} &amp;amp; a_{22} &amp;amp; \cdots &amp;amp; a_{2n} \\
a_{31} &amp;amp; a_{32} &amp;amp; \cdots &amp;amp; a_{3n} \\
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots \\
a_{n1} &amp;amp; a_{n2} &amp;amp; \cdots &amp;amp; a_{nn}
\end{pmatrix} \]&lt;/dd&gt;
&lt;dd&gt;行列を表すときに通常は、最終の列番号をmで、最終の行番号をnで表すことが多いが、正方行列では\( m = n \)となるので、ここではどちらもnで表している。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;n次の正方行列&lt;/dt&gt;
&lt;dd&gt;列数がnで、行数がnの正方行列は、n次の正方行列と呼ばれている。Aを正方行列とすると、\( A_n \)のように添字で表記されることがある。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;行列式&lt;/dt&gt;
&lt;dd&gt;各々の正方行列から計算することができる一意のスカラー。その値が0の場合もある。ある正方行列を与えるとそれに対応する一意の実数か一意の複素数を出力する函数であると考えることができる。&lt;/dd&gt;
&lt;dd&gt;正方行列を\( A \)とすると、その行列式は\( |A| \)や\( det\ A \)やdet(A)のように表記されることがある。detは英語のa determinantの略記。&lt;/dd&gt;
&lt;dd&gt;2次の正方行列\( A = \begin{pmatrix} a_{11} &amp;amp; a_{12} \\ a_{21} &amp;amp; a_{22} \end{pmatrix} \)の行列式は\( A^{-1} = a_{11}a_{22} - a_{12}a_{21} \)と計算することができ、これが行列式の基本となる。&lt;/dd&gt;
&lt;dd&gt;Maximaではdeterminant()函数に、GNU Octaveではdet()函数に、Juliaではusing LinearAlgebraを宣言しておいてdet()函数に、R言語ではdet()函数に、Python3ではnumpyをインポートしておいてnumpy.linalg.det()函数に、正方行列を渡せば行列式を出力してくれる。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;スカラー&lt;/dt&gt;
&lt;dd&gt;線形代数においてベクトルや行列やテンソルでない単独の数の総称。英語ではa scalar。実数か複素数。行列式や行列のスカラー倍で使われる。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;ラプラス展開（線形代数における）&lt;/dt&gt;
&lt;dd&gt;3次以上の正方行列の行列式を計算するために2次の正方行列の行列式の形になるまでそれを展開してゆく方法。余因子展開とも呼ばれている。英語ではthe Laplace expansion、もしくはthe cofactor expansion。&lt;/dd&gt;
&lt;dd&gt;正方行列のどれか1つの行か列を選んでその各成分についての小行列式\( M_{ij} \)を求め、その小行列式に1か-1を一定の規則に従って掛けること（\( (-1)^{i+j} M_{ij} \)）によって正負の符号を持つ余因子\( C_{ij} \)を作り、その余因子に元の成分を掛ける（\( a_{ij}C_{ij} \)）。1つの実数か複素数の値が得られるまでそれらの処理を繰り返しながら次々と合計してゆく。何番目の列または行に沿った小行列による行列式のラプラス展開と言い表したりする。&lt;/dd&gt;
&lt;dd class=&quot;math&quot;&gt;\[ |A| = \sum_{j=1}^n a_{ij} (-1)^{i+j} M_{ij}
= \sum_{i=1}^n a_{ij} (-1)^{i+j} M_{ij} \]&lt;/dd&gt;
&lt;dd&gt;どの列またはどの行を選んでも同じ計算結果が得られることが定理として証明されている。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;サラスのルール&lt;/dt&gt;
&lt;dd&gt;3次の正方行列限定の行列式計算法。サラスの規則、サラスの法則、サラスの方法などとも呼ばれている。英語ではthe rule of SarrusないしSarrus&#39; rule。日本でよく目にする「たすき掛け」と呼ばれている方法もこれの一種。&lt;/dd&gt;
&lt;dd&gt;&lt;ol&gt;
&lt;li&gt;3次の正方行列の1列目と2列目をコピーして3列目の右隣に貼り付ける。&lt;/li&gt;
&lt;li&gt;左上から右下への対角線上の成分を掛けて3つの項を作る。&lt;/li&gt;
&lt;li&gt;次に右上から左下への対角線上の成分を掛けて3つの項を作る。&lt;/li&gt;
&lt;li&gt;前者の3つの項に正の符号を与え、後者の3つの項には負の符号を与える。&lt;/li&gt;
&lt;li&gt;それらを合計すると、その3次正方行列の行列式が求まる。&lt;/li&gt;
&lt;/ol&gt;&lt;/dd&gt;
&lt;dd&gt;これを修正してn次の正方行列にも応用できるようにする試みがあるようだ。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;逆行列&lt;/dt&gt;
&lt;dd&gt;逆数の行列版のようなもの。英語ではan inverse matrixと呼ばれている。&lt;/dd&gt;
&lt;dd&gt;全ての正則行列にはその逆行列がある。逆行列は正則行列の転置後の余因子行列の各成分を正則行列の行列式で割ったもの。つまり、正則行列をAとし、Aの逆行列を\( A^{-1} \)とし、転置された余因子行列を\( adj\ A \)とし、Aの行列式を\( det\ A \)とすると次の関係が成り立つ。&lt;/dd&gt;
&lt;dd class=&quot;math&quot;&gt;\[ A^{-1} = \dfrac{adj\ A}{det\ A} = \dfrac{1}{det\ A} adj\ A \]&lt;/dd&gt;
&lt;dd&gt;Maximaではinvert()函数に、GNU Octaveではinv()函数に、Juliaではinv()函数に、Python3ではNumpyをインポートしてからnumpy.linalg.inv()函数に、R言語ではinv()函数に、正則行列を渡せばその逆行列を出力してくれる。ただしR言語ではmatlibというライブラリが必要になる。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;正則行列&lt;/dt&gt;
&lt;dd&gt;正方行列で、かつ、その行列式の値が0でない行列のこと。可逆であるとか非特異であるとも呼ばれている。正則行列だけがその逆行列を持っている。英語ではan invertible matrix。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;単位行列&lt;/dt&gt;
&lt;dd&gt;対角行列の内のひとつ。行列の成分の主対角線上、つまり\( a_{11} \)から\( a_{nn} \)にかけて1が並び、その他の成分が0であるような正方行列のこと。\( I \)で表す。次元数は\( I_n \)のnに数を代入して表す。英語ではan identity matrixと呼ばれている。&lt;/dd&gt;
&lt;dd class=&quot;math&quot;&gt;\[ I_n = \begin{pmatrix}
1 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0 \\
0 &amp;amp; 1 &amp;amp; 0 &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0 \\
0 &amp;amp; 0 &amp;amp; 1 &amp;amp; 0 &amp;amp; \cdots &amp;amp; 0 \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 1 &amp;amp; \cdots &amp;amp; 0 \\
\vdots &amp;amp; \vdots &amp;amp; \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots \\
0 &amp;amp; 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; \cdots &amp;amp; 1 \end{pmatrix} \]&lt;/dd&gt;
&lt;dd&gt;単位行列は行列同士の非可換性の乗法における単位元に当たる行列。&lt;/dd&gt;
&lt;dd&gt;正則行列にその逆行列を掛けると単位行列が得られ、この場合に限って交換法則が成り立つことから、逆行列の検算に用いることができる。正則行列をAとし、Aの逆行列を\( A^{-1} \)とし、単位行列を\( I \)とすると次の関係が成り立つ。&lt;/dd&gt;
&lt;dd class=&quot;math&quot;&gt;\[ A A^{-1} = A^{-1} A = I \]&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;余因子&lt;/dt&gt;
&lt;dd&gt;正方行列の成分をラプラス展開して得られた小行列式\( M_{ij} \)に1または-1のいずれかを規則に従って掛けたもの。英語ではa cofactor。&lt;/dd&gt;
&lt;dd&gt;1を掛けるか-1を掛けるかは\( (-1)^{i+j} \)によって定まる。iは列番号、jは行番号。1を掛けても小行列式の正負の符号はそのままだが、-1を掛けると小行列式の正負の符号が反転することに注目。&lt;/dd&gt;
&lt;dd&gt;余因子は、Aを正方行列だとすると、\( cof\ A \)やcof(A)、またはCと表記されることがある。&lt;/dd&gt;
&lt;dd class=&quot;math&quot;&gt;\[ \begin{align} cof\ A  = C = (-1)^{i + j} M_ij \end{align} \]&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;余因子行列&lt;/dt&gt;
&lt;dd&gt;2つの意味がある。1つは正方行列の各成分をその余因子（小行列式に1か-1を掛けたもの）によって置き換えた行列のこと。これは英語でa cofactor matrixと呼ばれているもの。もう1つの意味はa cofactor matrixを転置した行列のこと。転置は英語でtranspose。転置後の余因子行列は英語ではan adjugate matrixと呼ばれている。&lt;/dd&gt;
&lt;dd&gt;An adjugate matrixはa classical adjoint matrixとも呼ばれていることがある。数式処理システムのMaxiamではこの意味で函数名としてadjointという呼び名が使われている。&lt;/dd&gt;
&lt;dd&gt;転置した後の余因子行列の各成分を元の正方行列の行列式で割ると逆行列が得られる。転置前の余因子行列は\( cof\ A \)やcof(A)、または\( C \)と記すことができ、転置後の余因子行列は\( adj\ A \)やadj(A)、または\( C^T \)と記すことができる。&lt;/dd&gt;
&lt;dd&gt;例えば、2次の正方行列の余因子行列は次のようになる。&lt;/dd&gt;
&lt;dd class=&quot;math&quot;&gt;\[ \begin{align}
cof \begin{pmatrix} a_{11} &amp;amp; a_{12} \\
a_{21} &amp;amp; a_{22} \end{pmatrix} &amp;amp;= C_2 \\
&amp;amp;= \begin{pmatrix} a_{22} &amp;amp; a_{21} \\ a_{12} &amp;amp; a_{11} \end{pmatrix}
\circ \begin{pmatrix} 1 &amp;amp; -1 \\ -1 &amp;amp; 1 \end{pmatrix} \\
&amp;amp;= \begin{pmatrix} 1 \cdot a_{22} &amp;amp; -1 \cdot a_{21} \\
-1 \cdot a_{12} &amp;amp; 1 \cdot a_{11} \end{pmatrix} \\
&amp;amp;= \begin{pmatrix} a_{22} &amp;amp; -a_{21} \\ -a_{12} &amp;amp; a_{11} \end{pmatrix}
\end{align} \]&lt;/dd&gt;
&lt;dd&gt;小行列式からなる行列から余因子の行列を求める場合、小行列の行列の各成分と1と-1とがチェッカー・フラック状に並ぶ行列の各成分とを成分ごとにスカラー倍するアダマール積を用いることができる。アダマール積の演算子は\( \circ \)か\( \odot \)。&lt;/dd&gt;
&lt;dd&gt;これを転置すると次のようになる。&lt;/dd&gt;
&lt;dd class=&quot;math&quot;&gt;\[ adj \begin{pmatrix} a_{11} &amp;amp; a_{12} \\
a_{21} &amp;amp; a_{22} \end{pmatrix} = C^T_2
= \begin{pmatrix} a_{22} &amp;amp; -a_{12} \\ -a_{21} &amp;amp; a_{11}
\end{pmatrix} \]&lt;/dd&gt;
&lt;dd&gt;転置された余因子行列は、数式処理システムMaximaではadjoint()函数で得られ、GNU OctaveとJuliaではAが正方行列の場合にdet(A) * inv(A)という式で得られるが、Juliaではdet()函数を使うためにusing LinearAlgebraの指定が必要。R言語ではadjoint()函数を用いることができるが、そのためにはmatlibというパッケージが必要になる。&lt;/dd&gt;
&lt;dd&gt;det(A) * inv(A)により、転置された余因子行列がなぜ得られるかは、逆行列を導く演算の逆演算だと考えればいいかもしれない。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;小行列&lt;/dt&gt;
&lt;dd&gt;ラプラス展開（別名：余因子展開）の手続きの途中で得られる行列の中の部分行列のこと。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;小行列式&lt;/dt&gt;
&lt;dd&gt;小行列の行列式。英語ではa minor。ラプラス展開の過程で生ずる部分行列の行列式。&lt;/dd&gt;
&lt;dd&gt;Maximaで小行列式を求めるには例えばminor(A,1,1)函数を利用できる。第1引数のAは行列、第2引数の1は列番号、第3引数の1は行番号。この例ではAという正方行列の\( a_{11} \)の小行列式を求めている。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;行列同士の除法&lt;/dt&gt;
&lt;dd&gt;行列同士の除法は未定義とされることがあるが、特定の条件の下では成り立つ。除算行列に逆行列があれば、つまり除算行列が正則行列であるならばその除算行列を逆行列に変換し、逆行列の乗法に直して計算することができる。&lt;/dd&gt;
&lt;dd class=&quot;math&quot;&gt;\[ A \div B = A \cdot B^{-1} \]&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;h4&gt;関連投稿&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2018/08/blog-post.html&quot;&gt;数学の行列とその情報処理の初歩ノート&lt;/a&gt;&lt;/dt&gt;
&lt;dt&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2018/08/r.html&quot;&gt;行列の加法・減法・実数倍・乗法 + R言語&lt;/a&gt;&lt;/dt&gt;
&lt;dt&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2021/12/blog-post_11.html&quot;&gt;ガウスの消去法（掃き出し法） 行基本変形 行簡約階段形&lt;/a&gt;&lt;/dt&gt;
&lt;/dl&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/5090877743738473502/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2021/07/blog-post_18.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/5090877743738473502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/5090877743738473502'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2021/07/blog-post_18.html' title='行列式、ラプラス展開、逆行列、行列の割り算'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-4112267811303614628</id><published>2021-04-14T19:47:00.011+09:00</published><updated>2026-03-14T15:03:57.457+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Maxima"/><category scheme="http://www.blogger.com/atom/ns#" term="数学"/><title type='text'>速さ、時間、距離の関係、及び除数や分母が未知数の方程式</title><content type='html'>&lt;p&gt;速さの&lt;ruby&gt;平均&lt;rt&gt;へいきん&lt;/rt&gt;&lt;/ruby&gt;、&lt;ruby&gt;距離&lt;rt&gt;きょり&lt;/rt&gt;&lt;/ruby&gt;、&lt;ruby&gt;時間&lt;rt&gt;じかん&lt;/rt&gt;&lt;/ruby&gt;の関係は次のとおり。距離は道のりと呼ばれることもある。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
速さの平均 &amp;amp;= 距離 \div 時間 \\
時間 &amp;amp;= 距離 \div 速さの平均 \\
距離 &amp;amp;= 速さの平均 \times 時間
\end{align*}&lt;/div&gt;
&lt;dl&gt;
&lt;dt&gt;速さの平均とは？&lt;/dt&gt;    
&lt;dd&gt;距離をかかった時間で割ったもの。時間分の距離。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;かかった時間とは？&lt;/dt&gt;
&lt;dd&gt;距離を速さの平均で割ったもの。速さの平均分の距離。&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;距離とは？&lt;/dt&gt;
&lt;dd&gt;速さの平均をかかった時間&lt;ruby&gt;倍&lt;rt&gt;ばい&lt;/rt&gt;&lt;/ruby&gt;したもの、または、かかった時間を速さの平均倍したもの。&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;ただし、速さの平均、時間、距離には、その計り方の目盛りになる各々の単位がそれぞれ付く。時間の単位は例えば秒(s)、分(m)、時間(h)など。距離の単位はメートル法を用いるならば例えばメートル(m)とかキロメートル(km)など。速さの平均の単位は例えば時速何キロメートル（km/h）、秒速何メートル(m/s)など。&lt;/p&gt;
&lt;h4&gt;方程式を使って代数的に解く&lt;/h4&gt;
&lt;p&gt;&lt;ruby&gt;方程式&lt;rt&gt;ほうていしき&lt;/rt&gt;&lt;/ruby&gt;の解き方が分かっている場合、これら3つの関係式を3つとも覚える必要はないかもしれない。方程式とは式の答えは分かっているがその式の一部の数が欠けているような式のこと。欠けている数は&lt;ruby&gt;未知数&lt;rt&gt;みちすう&lt;/rt&gt;&lt;/ruby&gt;と呼ばれ、それを文字に置き換えて&lt;ruby&gt;代数&lt;rt&gt;だいすう&lt;/rt&gt;&lt;/ruby&gt;的なやり方で解く。&lt;/p&gt;
&lt;p&gt;例えば次のような式が方程式。\( x \)が未知数。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ x + 5 = 10 \]
\[ \colorbox{yellow}{\(10 - x = 5\)} \]
\[ 2x = 10 \]
\[ \dfrac{x}{2} = \dfrac{5}{2} \]
\[ \colorbox{yellow}{\(\dfrac{25}{x} = 5\)} \]&lt;/div&gt;
&lt;p&gt;黄色く色付けされている方程式は少し見馴れないかもしれない。1つは引き算の引く数が未知数であり、もう1つは分母が未知数である方程式。&lt;/p&gt;
&lt;p&gt;黄色く色付けされていない方程式は&lt;ruby&gt;移項&lt;rt&gt;いこう&lt;/rt&gt;&lt;/ruby&gt;という方法によって解くことができる。これは未知数が属す辺から未知数以外の定数を取り除くために逆演算を使う。逆演算とは足し算に対する引き算、引き算に対する足し算、掛け算に対する割り算、割り算に対する足し算のこと。&lt;/p&gt;
&lt;p&gt;方程式は両辺が常に等しくなる必要があるので両辺に必ず同じ演算を施す。この処理を簡略化したものが移項。定数とその演算が片方の辺からもう片方の辺に移動したときに逆演算になることに注目。&lt;/p&gt;
&lt;p&gt;では上記の方程式を移項という方法を使って具体的に解いてみる。&lt;/p&gt;
&lt;p&gt;左辺では5を足しているので右辺では5を引く。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
x \colorbox{cyan}{+ 5} &amp;amp;= 10 \\
x &amp;amp;= 10 \colorbox{pink}{- 5} \\
x &amp;amp;= 5 \end{align*}&lt;/div&gt;
&lt;p&gt;左辺では2を掛けているので右辺では2で割る。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
\colorbox{cyan}{2}x &amp;amp;= 10 \\
x &amp;amp;= 10 \colorbox{pink}{\( \div 2 \)} \\
x &amp;amp;= 5 \end{align*}&lt;/div&gt;
&lt;p&gt;左辺では2で割っているので右辺では2を掛ける。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
\dfrac{x}{2} &amp;amp;= \dfrac{5}{2} \\
x \colorbox{cyan}{\( \div 2 \)} &amp;amp;= \dfrac{5}{2} \\
x &amp;amp;= \dfrac{5 \colorbox{pink}{\( \cdot 2 \)}}{2} \\
x &amp;amp;= \dfrac{10}{2} \\
x &amp;amp;= \dfrac{5}{1} = 5 \end{align*}&lt;/div&gt;
&lt;p&gt;黄色く色付けされた方程式では移項を用いない。xと右辺の値をただ交換するだけ。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
10 - \colorbox{cyan}{\( x \)} &amp;amp;= \colorbox{pink}{5} \\
10 - \colorbox{pink}{5} &amp;amp;= \colorbox{cyan}{\( x \)} \\
5 &amp;amp;= x \end{align*}&lt;/div&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
\dfrac{25}{\colorbox{cyan}{\( x \)}} &amp;amp;= \colorbox{pink}{5} \\
\dfrac{25}{\colorbox{pink}{5}} &amp;amp;= \colorbox{cyan}{\( x \)} \\
\dfrac{5}{1} &amp;amp;= x \\
5 &amp;amp;= x \end{align*}&lt;/div&gt;
&lt;p&gt;数式処理システムMaximaでこれらの方程式を解くにはsolve(方程式,未知数)&lt;ruby&gt;函数&lt;rt&gt;かんすう&lt;/rt&gt;&lt;/ruby&gt;を用いることができる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ maxima
Maxima 5.42.1 http://maxima.sourceforge.net
（中略）
(%i1) solve(x+5=10,x);
(%o1)                               [x = 5]
(%i2) solve(10-x=5,x);
(%o2)                               [x = 5]
(%i3) solve(2*x=10,x);
(%o3)                               [x = 5]
(%i4) solve(x/2=5/2,x);
(%o4)                               [x = 5]
(%i5) solve(25/x=5,x);
(%o5)                               [x = 5]
(%i6) quit();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;いずれも\( x = 5 \)であることが分かった。&lt;/p&gt;
&lt;p&gt;方程式の解き方を分かっていれば、例えば速さの平均が次のような関係を持っていることを知っているだけで十分。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\[ 速さの平均 = \dfrac{距離}{時間} \]&lt;/div&gt;
&lt;p&gt;速さの平均が毎時4kmで5時間歩いたとき、どれだけの距離を歩いたか知るためには方程式に次のように値を代入してそれを解く。距離を未知数のdで表すことにする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
4 &amp;amp;= \dfrac{d}{\colorbox{cyan}{5}} \\
4 \colorbox{pink}{\(\times\) 5} &amp;amp;= d \\
20 &amp;amp;= d
\end{align*}&lt;/div&gt;
&lt;p&gt;この方程式の右辺の5を左辺に移項することによって\( d = 20 \)という解が得られた。よって距離は20km。&lt;/p&gt;
&lt;p&gt;速さの平均が毎時15kmで300kmの距離を移動したとき、どれだけの時間tを要したかを知りたければ、方程式に次のように値を代入してそれを解く。時間を未知数のtで表すことにする。&lt;/p&gt;
&lt;div class=&quot;math&quot;&gt;\begin{align*}
15 &amp;amp;= \dfrac{300}{t} \\
t &amp;amp;= \dfrac{300}{15} \\
t &amp;amp;= \dfrac{20}{1} \\
t &amp;amp;= 20
\end{align*}&lt;/div&gt;
&lt;p&gt;これは分母に未知数がある方程式なので移項を用いないで解くことができた。かかる時間は20時間。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/4112267811303614628/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2021/04/blog-post_14.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/4112267811303614628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/4112267811303614628'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2021/04/blog-post_14.html' title='速さ、時間、距離の関係、及び除数や分母が未知数の方程式'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4092105836392232093.post-6714954191656232974</id><published>2021-02-07T04:02:00.006+09:00</published><updated>2025-09-04T11:16:35.699+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MariaDB"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="データベース"/><title type='text'>MariaDBかMySQLでSELECTステートメント色々 - その1</title><content type='html'>&lt;p&gt;この記事で使用しているソフトウェア環境は、OSとしてDebian GNU/Linux 10を使用し、その公式リポジトリからMariaDBというデータベースをインストールしてある。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;$ cat /etc/os-release
PRETTY_NAME=&quot;Debian GNU/Linux 10 (buster)&quot;
...
$ mariadb --version
mariadb  Ver 15.1 Distrib 10.3.27-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;しかし、記事内容のほとんどはSQLに関するものであり、オペレーティング・システムの環境には依存しないはず。&lt;/p&gt;
&lt;h4&gt;データを選び出すSELECT構文&lt;/h4&gt;
&lt;p&gt;SELECT構文はその名のとおり、1つまたは2つ以上のデータベース・テーブルからデータを選択して取得するために用いることができる。FROM句ではその対象とするテーブル名を1つまたは2つ以上指定することができる。&lt;/p&gt;
&lt;p&gt;SELECT構文のもっとも単純な形式は次のようになる。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;SELECT レコード名1,レコード名2,...
FROM テーブル名1,テーブル名2,...;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SELECT構文はSQLなので構文の終わりに文末を示す;（セミコロン）が必要。&lt;/p&gt;
&lt;p&gt;多くの場合、テーブル全体を選択するためにレコード名の代わりに*（アスタリスク）が用いられている。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;SELECT * FROM テーブル名;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;レコードを絞り込んで選ぶにはWHERE句に条件式を指定する。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;SELECT レコード名1,レコード名2,...
FROM テーブル名1,テーブル名2,...
WHERE 条件式;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;等価演算子&lt;/h4&gt;
&lt;p&gt;もっとも単純な条件式は「レコード名 = 値」のようなものになる。*（アスタリスク）は全てを意味する。SELECT *は全ての列（レコード）。&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&lt;code&gt;SELECT *
FROM テーブル名
WHERE レコード名 = 値;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;=（イコール）は等価演算子と呼ばれている。値が数値型以外では&#39;（一重引用符）で挟む必要がある。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT * FROM persons;
+----+-----------+-----------+--------+------------+--------+--------+
| id | 姓        | 名        | 性別   | 生年月日   | 身長   | 体重   |
+----+-----------+-----------+--------+------------+--------+--------+
|  1 | 足利      | 直美      | 女     | 1997-10-11 |  164.7 |     55 |
|  2 | 大岩      | 舞        | 女     | 2002-03-23 |  158.4 |   43.5 |
|  3 | 木下      | 誠一      | 男     | 1995-07-15 |  168.5 |   65.5 |
|  4 | 伊藤      | エリナ    | 女     | 1996-09-29 |    162 |   50.5 |
|  5 | 野村      | 一樹      | 男     | 1999-05-20 |  172.5 |   68.7 |
|  6 | 山本      | 花梨      | 女     | 2005-12-03 |  158.8 |   42.5 |
|  7 | 小野田    | 真司      | 男     | 1988-11-12 |  165.5 |     64 |
|  8 | 的山      | 美麗      | 女     | 1985-07-02 |  164.5 |   50.5 |
|  9 | 桑村      | 涼        | 男     | 1993-03-18 |    165 |   60.3 |
| 10 | 新見      | 康隆      | 男     | 1989-06-30 |  177.6 |   70.6 |
| 11 | 山田      | 真理子    | 女     | 1991-01-03 |  155.8 |   40.8 |
| 12 | 田辺      | 春        | 男     | 2000-03-15 |    182 |   78.5 |
+----+-----------+-----------+--------+------------+--------+--------+
12 rows in set (0.000 sec)

MariaDB [mydatabase]&amp;gt; SELECT * FROM persons
    -&amp;gt; WHERE 性別 = &#39;女&#39;;
+----+--------+-----------+--------+------------+--------+--------+
| id | 姓     | 名        | 性別   | 生年月日   | 身長   | 体重   |
+----+--------+-----------+--------+------------+--------+--------+
|  1 | 足利   | 直美      | 女     | 1997-10-11 |  164.7 |     55 |
|  2 | 大岩   | 舞        | 女     | 2002-03-23 |  158.4 |   43.5 |
|  4 | 伊藤   | エリナ    | 女     | 1996-09-29 |    162 |   50.5 |
|  6 | 山本   | 花梨      | 女     | 2005-12-03 |  158.8 |   42.5 |
|  8 | 的山   | 美麗      | 女     | 1985-07-02 |  164.5 |   50.5 |
| 11 | 山田   | 真理子    | 女     | 1991-01-03 |  155.8 |   40.8 |
+----+--------+-----------+--------+------------+--------+--------+
6 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;不等価演算子&lt;/h4&gt;
&lt;p&gt;WHERE句の条件式のところで=という演算子の代わりに!=もしくは&amp;lt;&amp;gt;という演算子を用いると、その値を除くという意味になる。これらは不等価演算子と呼ばれている。下の例では「性別が女に等しくない」という条件を表している。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT * FROM persons
    -&amp;gt; WHERE 性別 != &#39;女&#39;;
+----+-----------+--------+--------+------------+--------+--------+
| id | 姓        | 名     | 性別   | 生年月日   | 身長   | 体重   |
+----+-----------+--------+--------+------------+--------+--------+
|  3 | 木下      | 誠一   | 男     | 1995-07-15 |  168.5 |   65.5 |
|  5 | 野村      | 一樹   | 男     | 1999-05-20 |  172.5 |   68.7 |
|  7 | 小野田    | 真司   | 男     | 1988-11-12 |  165.5 |     64 |
|  9 | 桑村      | 涼     | 男     | 1993-03-18 |    165 |   60.3 |
| 10 | 新見      | 康隆   | 男     | 1989-06-30 |  177.6 |   70.6 |
| 12 | 田辺      | 春     | 男     | 2000-03-15 |    182 |   78.5 |
+----+-----------+--------+--------+------------+--------+--------+
6 rows in set (0.000 sec)

MariaDB [mydatabase]&amp;gt; SELECT * FROM persons
    -&amp;gt; WHERE 性別 &amp;lt;&amp;gt; &#39;男&#39;;
+----+--------+-----------+--------+------------+--------+--------+
| id | 姓     | 名        | 性別   | 生年月日   | 身長   | 体重   |
+----+--------+-----------+--------+------------+--------+--------+
|  1 | 足利   | 直美      | 女     | 1997-10-11 |  164.7 |     55 |
|  2 | 大岩   | 舞        | 女     | 2002-03-23 |  158.4 |   43.5 |
|  4 | 伊藤   | エリナ    | 女     | 1996-09-29 |    162 |   50.5 |
|  6 | 山本   | 花梨      | 女     | 2005-12-03 |  158.8 |   42.5 |
|  8 | 的山   | 美麗      | 女     | 1985-07-02 |  164.5 |   50.5 |
| 11 | 山田   | 真理子    | 女     | 1991-01-03 |  155.8 |   40.8 |
+----+--------+-----------+--------+------------+--------+--------+
6 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;IN()函数とNOT IN()函数&lt;/h4&gt;
&lt;p&gt;等価演算子の=（イコール）の右辺を複数の値にしたい場合、等価演算子の代わりにIN()函数を用いることができる。下の例では、「名」として「舞」「エリナ」「真司」「春」を指定しているので、そのいずれかと一致する名を持つ列（レコード）が全て選び出されている。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT * FROM persons
    -&amp;gt; WHERE 名 IN(&#39;舞&#39;,&#39;エリナ&#39;,&#39;真司&#39;,&#39;春&#39;);
+----+-----------+-----------+--------+------------+--------+--------+
| id | 姓        | 名        | 性別   | 生年月日   | 身長   | 体重   |
+----+-----------+-----------+--------+------------+--------+--------+
|  2 | 大岩      | 舞        | 女     | 2002-03-23 |  158.4 |   43.5 |
|  4 | 伊藤      | エリナ    | 女     | 1996-09-29 |    162 |   50.5 |
|  7 | 小野田    | 真司      | 男     | 1988-11-12 |  165.5 |     64 |
| 12 | 田辺      | 春        | 男     | 2000-03-15 |    182 |   78.5 |
+----+-----------+-----------+--------+------------+--------+--------+
4 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;IN()函数の代わりにNOT IN()函数を用いるとその引数に指定した値を除くという条件になる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT * FROM persons;
+----+-----------+-----------+--------+------------+--------+--------+
| id | 姓        | 名        | 性別   | 生年月日   | 身長   | 体重   |
+----+-----------+-----------+--------+------------+--------+--------+
|  1 | 足利      | 直美      | 女     | 1997-10-11 |  164.7 |     55 |
|  2 | 大岩      | 舞        | 女     | 2002-03-23 |  158.4 |   43.5 |
|  3 | 木下      | 誠一      | 男     | 1995-07-15 |  168.5 |   65.5 |
|  4 | 伊藤      | エリナ    | 女     | 1996-09-29 |    162 |   50.5 |
|  5 | 野村      | 一樹      | 男     | 1999-05-20 |  172.5 |   68.7 |
|  6 | 山本      | 花梨      | 女     | 2005-12-03 |  158.8 |   42.5 |
|  7 | 小野田    | 真司      | 男     | 1988-11-12 |  165.5 |     64 |
|  8 | 的山      | 美麗      | 女     | 1985-07-02 |  164.5 |   50.5 |
|  9 | 桑村      | 涼        | 男     | 1993-03-18 |    165 |   60.3 |
| 10 | 新見      | 康隆      | 男     | 1989-06-30 |  177.6 |   70.6 |
| 11 | 山田      | 真理子    | 女     | 1991-01-03 |  155.8 |   40.8 |
| 12 | 田辺      | 春        | 男     | 2000-03-15 |    182 |   78.5 |
+----+-----------+-----------+--------+------------+--------+--------+
12 rows in set (0.000 sec)

MariaDB [mydatabase]&amp;gt; SELECT * FROM persons
    -&amp;gt; WHERE 姓 NOT IN(&#39;大岩&#39;,&#39;伊藤&#39;,&#39;山本&#39;,&#39;桑村&#39;,&#39;田辺&#39;);
+----+-----------+-----------+--------+------------+--------+--------+
| id | 姓        | 名        | 性別   | 生年月日   | 身長   | 体重   |
+----+-----------+-----------+--------+------------+--------+--------+
|  1 | 足利      | 直美      | 女     | 1997-10-11 |  164.7 |     55 |
|  3 | 木下      | 誠一      | 男     | 1995-07-15 |  168.5 |   65.5 |
|  5 | 野村      | 一樹      | 男     | 1999-05-20 |  172.5 |   68.7 |
|  7 | 小野田    | 真司      | 男     | 1988-11-12 |  165.5 |     64 |
|  8 | 的山      | 美麗      | 女     | 1985-07-02 |  164.5 |   50.5 |
| 10 | 新見      | 康隆      | 男     | 1989-06-30 |  177.6 |   70.6 |
| 11 | 山田      | 真理子    | 女     | 1991-01-03 |  155.8 |   40.8 |
+----+-----------+-----------+--------+------------+--------+--------+
7 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;左不等価演算子と右不等価演算子&lt;/h4&gt;
&lt;p&gt;次の例ではWHERE句の条件式に小なり（&amp;lt;）／大なり（&amp;gt;）を利用している。&amp;lt;は左不等価演算子と呼ばれ、&amp;gt;は右不等価演算子と呼ばれている。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT * FROM persons
    -&amp;gt; WHERE 身長 &amp;lt; 165;
+----+--------+-----------+--------+------------+--------+--------+
| id | 姓     | 名        | 性別   | 生年月日   | 身長   | 体重   |
+----+--------+-----------+--------+------------+--------+--------+
|  1 | 足利   | 直美      | 女     | 1997-10-11 |  164.7 |     55 |
|  2 | 大岩   | 舞        | 女     | 2002-03-23 |  158.4 |   43.5 |
|  4 | 伊藤   | エリナ    | 女     | 1996-09-29 |    162 |   50.5 |
|  6 | 山本   | 花梨      | 女     | 2005-12-03 |  158.8 |   42.5 |
|  8 | 的山   | 美麗      | 女     | 1985-07-02 |  164.5 |   50.5 |
| 11 | 山田   | 真理子    | 女     | 1991-01-03 |  155.8 |   40.8 |
+----+--------+-----------+--------+------------+--------+--------+
6 rows in set (0.000 sec)

MariaDB [mydatabase]&amp;gt; SELECT * FROM persons
    -&amp;gt; WHERE 生年月日 &amp;gt; &#39;1999-12-31&#39;;
+----+--------+--------+--------+------------+--------+--------+
| id | 姓     | 名     | 性別   | 生年月日   | 身長   | 体重   |
+----+--------+--------+--------+------------+--------+--------+
|  2 | 大岩   | 舞     | 女     | 2002-03-23 |  158.4 |   43.5 |
|  6 | 山本   | 花梨   | 女     | 2005-12-03 |  158.8 |   42.5 |
| 12 | 田辺   | 春     | 男     | 2000-03-15 |    182 |   78.5 |
+----+--------+--------+--------+------------+--------+--------+
3 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;以上演算子と以下演算子&lt;/h4&gt;
&lt;p&gt;&amp;lt;=（以下）または&amp;gt;=（以上）もある。前者は以下演算子、後者は以上演算子。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT * FROM persons
    -&amp;gt; WHERE 体重 &amp;gt;= 55;
+----+-----------+--------+--------+------------+--------+--------+
| id | 姓        | 名     | 性別   | 生年月日   | 身長   | 体重   |
+----+-----------+--------+--------+------------+--------+--------+
|  1 | 足利      | 直美   | 女     | 1997-10-11 |  164.7 |     55 |
|  3 | 木下      | 誠一   | 男     | 1995-07-15 |  168.5 |   65.5 |
|  5 | 野村      | 一樹   | 男     | 1999-05-20 |  172.5 |   68.7 |
|  7 | 小野田    | 真司   | 男     | 1988-11-12 |  165.5 |     64 |
|  9 | 桑村      | 涼     | 男     | 1993-03-18 |    165 |   60.3 |
| 10 | 新見      | 康隆   | 男     | 1989-06-30 |  177.6 |   70.6 |
| 12 | 田辺      | 春     | 男     | 2000-03-15 |    182 |   78.5 |
+----+-----------+--------+--------+------------+--------+--------+
7 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;gt;= 55は55を含むので体重が55であるIDが1の名簿も選ばれている。&lt;/p&gt;
&lt;h4&gt;論理演算子&lt;/h4&gt;
&lt;p&gt;論理演算子としてANDまたは&amp;amp;&amp;amp;、ORまたは||、そしてXORがある。&lt;/p&gt;
&lt;p&gt;次の例では、女であることと生年月日が2000-01-01以降であることを共に満たすことを条件にしている。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT * FROM persons
    -&amp;gt; WHERE 性別 = &#39;女&#39; AND 生年月日 &amp;gt;= &#39;2000-01-01&#39;;
+----+--------+--------+--------+------------+--------+--------+
| id | 姓     | 名     | 性別   | 生年月日   | 身長   | 体重   |
+----+--------+--------+--------+------------+--------+--------+
|  2 | 大岩   | 舞     | 女     | 2002-03-23 |  158.4 |   43.5 |
|  6 | 山本   | 花梨   | 女     | 2005-12-03 |  158.8 |   42.5 |
+----+--------+--------+--------+------------+--------+--------+
2 rows in set (0.001 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次の例では、身長が150より低いか、生年月日が1989-12-31以前か、いずれかを満たせばよいことを条件にしている。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT * FROM persons
    -&amp;gt; WHERE 身長 &amp;lt; 150 OR 生年月日 &amp;lt;= &#39;1989-12-31&#39;;
+----+-----------+--------+--------+------------+--------+--------+
| id | 姓        | 名     | 性別   | 生年月日   | 身長   | 体重   |
+----+-----------+--------+--------+------------+--------+--------+
|  7 | 小野田    | 真司   | 男     | 1988-11-12 |  165.5 |     64 |
|  8 | 的山      | 美麗   | 女     | 1985-07-02 |  164.5 |   50.5 |
| 10 | 新見      | 康隆   | 男     | 1989-06-30 |  177.6 |   70.6 |
+----+-----------+--------+--------+------------+--------+--------+
3 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次の例では、男でかつ生年月日が1990-01-01以前でないか、生年月日が1990-01-01以前でかつ男でないか、いずれかを満たすことを条件にしている。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT * FROM persons
    -&amp;gt; WHERE 性別 = &#39;男&#39; XOR 生年月日 &amp;lt; &#39;1990-01-01&#39;;
+----+--------+--------+--------+------------+--------+--------+
| id | 姓     | 名     | 性別   | 生年月日   | 身長   | 体重   |
+----+--------+--------+--------+------------+--------+--------+
|  3 | 木下   | 誠一   | 男     | 1995-07-15 |  168.5 |   65.5 |
|  5 | 野村   | 一樹   | 男     | 1999-05-20 |  172.5 |   68.7 |
|  8 | 的山   | 美麗   | 女     | 1985-07-02 |  164.5 |   50.5 |
|  9 | 桑村   | 涼     | 男     | 1993-03-18 |    165 |   60.3 |
| 12 | 田辺   | 春     | 男     | 2000-03-15 |    182 |   78.5 |
+----+--------+--------+--------+------------+--------+--------+
5 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;XORとは「XOR部分 = OR部分 - AND部分」に相当する。&lt;/p&gt;
&lt;h4&gt;特定の列（カラム）だけを選び出す&lt;/h4&gt;
&lt;p&gt;SELECTの後を*（アスタリスク）でなく具体的な列名にすれば、特定の列名だけを選んで出力することができる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT 姓,名,性別,生年月日
    -&amp;gt; FROM persons
    -&amp;gt; WHERE 生年月日 &amp;lt; &#39;2000-01-01&#39;
    -&amp;gt; AND 性別 = &#39;男&#39;;
+-----------+--------+--------+------------+
| 姓        | 名     | 性別   | 生年月日   |
+-----------+--------+--------+------------+
| 木下      | 誠一   | 男     | 1995-07-15 |
| 野村      | 一樹   | 男     | 1999-05-20 |
| 小野田    | 真司   | 男     | 1988-11-12 |
| 桑村      | 涼     | 男     | 1993-03-18 |
| 新見      | 康隆   | 男     | 1989-06-30 |
+-----------+--------+--------+------------+
5 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;BETWEEN...AND...演算子&lt;/h4&gt;
&lt;p&gt;ある区間を条件にしたいときにはBETWEEN演算子を用いる。次の例では、WHERE句に身長が160から170までの間を条件に指定している。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT 姓,名,身長
    -&amp;gt; FROM persons
    -&amp;gt; WHERE 身長
    -&amp;gt; BETWEEN 160 AND 170;
+-----------+-----------+--------+
| 姓        | 名        | 身長   |
+-----------+-----------+--------+
| 足利      | 直美      |  164.7 |
| 木下      | 誠一      |  168.5 |
| 伊藤      | エリナ    |    162 |
| 小野田    | 真司      |  165.5 |
| 的山      | 美麗      |  164.5 |
| 桑村      | 涼        |    165 |
+-----------+-----------+--------+
6 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;並べ替え（ソート）&lt;/h4&gt;
&lt;p&gt;SELECT構文にORDER BY句と特定の列名を追加することにより、その列（カラム）を基準に行（レコード）を並べ替えて出力することができる。通常はその列の昇順に並べ替えが行われる。&lt;/p&gt;
&lt;p&gt;次の例では、生年月日が古い順（昇順）に名簿を並べ替えている。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT 姓,名,生年月日
    -&amp;gt; FROM persons
    -&amp;gt; ORDER BY 生年月日;
+-----------+-----------+------------+
| 姓        | 名        | 生年月日   |
+-----------+-----------+------------+
| 的山      | 美麗      | 1985-07-02 |
| 小野田    | 真司      | 1988-11-12 |
| 新見      | 康隆      | 1989-06-30 |
| 山田      | 真理子    | 1991-01-03 |
| 桑村      | 涼        | 1993-03-18 |
| 木下      | 誠一      | 1995-07-15 |
| 伊藤      | エリナ    | 1996-09-29 |
| 足利      | 直美      | 1997-10-11 |
| 野村      | 一樹      | 1999-05-20 |
| 田辺      | 春        | 2000-03-15 |
| 大岩      | 舞        | 2002-03-23 |
| 山本      | 花梨      | 2005-12-03 |
+-----------+-----------+------------+
12 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;降順に並べ替えるにはORDER BY句の列名にDESCというキーワードを添える。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT 姓,名,生年月日
    -&amp;gt; FROM persons
    -&amp;gt; ORDER BY 生年月日DESC;
+-----------+-----------+------------+
| 姓        | 名        | 生年月日   |
+-----------+-----------+------------+
| 山本      | 花梨      | 2005-12-03 |
| 大岩      | 舞        | 2002-03-23 |
| 田辺      | 春        | 2000-03-15 |
| 野村      | 一樹      | 1999-05-20 |
| 足利      | 直美      | 1997-10-11 |
| 伊藤      | エリナ    | 1996-09-29 |
| 木下      | 誠一      | 1995-07-15 |
| 桑村      | 涼        | 1993-03-18 |
| 山田      | 真理子    | 1991-01-03 |
| 新見      | 康隆      | 1989-06-30 |
| 小野田    | 真司      | 1988-11-12 |
| 的山      | 美麗      | 1985-07-02 |
+-----------+-----------+------------+
12 rows in set (0.000 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;出力行数を制限する&lt;/h4&gt;
&lt;p&gt;SELECT構文にLIMIT句を設けることにより、出力される行数（レコード数）を制限することができる。&lt;/p&gt;
&lt;p&gt;次の例では、出力行数を20行までとしている。ORDER BY句には総人口の値を指定しているので、昇順、つまり総人口が少ない順に20位まで都道府県が出力される。ただし2019年の時点の値。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT 男女別,人口,全国都道府県,
    -&amp;gt; 時間軸（年）,value
    -&amp;gt; FROM popu_jp
    -&amp;gt; WHERE 時間軸（年） = &#39;2019年&#39;
    -&amp;gt; AND 人口 = &#39;総人口&#39;
    -&amp;gt; AND 男女別 = &#39;男女計&#39;
    -&amp;gt; ORDER BY value
    -&amp;gt; LIMIT 20;
+-----------+-----------+--------------------+--------------------+-------+
| 男女別    | 人口      | 全国都道府県       | 時間軸（年）       | value |
+-----------+-----------+--------------------+--------------------+-------+
| 男女計    | 総人口    | 鳥取県             | 2019年             |   556 |
| 男女計    | 総人口    | 島根県             | 2019年             |   674 |
| 男女計    | 総人口    | 高知県             | 2019年             |   698 |
| 男女計    | 総人口    | 徳島県             | 2019年             |   728 |
| 男女計    | 総人口    | 福井県             | 2019年             |   768 |
| 男女計    | 総人口    | 山梨県             | 2019年             |   811 |
| 男女計    | 総人口    | 佐賀県             | 2019年             |   815 |
| 男女計    | 総人口    | 和歌山県           | 2019年             |   925 |
| 男女計    | 総人口    | 香川県             | 2019年             |   956 |
| 男女計    | 総人口    | 秋田県             | 2019年             |   966 |
| 男女計    | 総人口    | 富山県             | 2019年             |  1044 |
| 男女計    | 総人口    | 宮崎県             | 2019年             |  1073 |
| 男女計    | 総人口    | 山形県             | 2019年             |  1078 |
| 男女計    | 総人口    | 大分県             | 2019年             |  1135 |
| 男女計    | 総人口    | 石川県             | 2019年             |  1138 |
| 男女計    | 総人口    | 岩手県             | 2019年             |  1227 |
| 男女計    | 総人口    | 青森県             | 2019年             |  1246 |
| 男女計    | 総人口    | 長崎県             | 2019年             |  1327 |
| 男女計    | 総人口    | 奈良県             | 2019年             |  1330 |
| 男女計    | 総人口    | 愛媛県             | 2019年             |  1339 |
+-----------+-----------+--------------------+--------------------+-------+
20 rows in set (0.016 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;都道府県の総人口のデータセットは、政府統計のポータルサイト&lt;a href=&quot;https://www.e-stat.go.jp&quot;&gt;e-Stat&lt;/a&gt;から借りている。出典は「人口推計 / 2019年10月1日現在」の「都道府県，男女別人口－総人口，日本人人口」。&lt;/p&gt;
&lt;p&gt;次の例では、総人口の多い都道府県の順（降順）に10位から30位までを出力している。LIMIT句に10,30と指定することによってそれを実現できる。&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;MariaDB [mydatabase]&amp;gt; SELECT 男女別,人口,全国都道府県,
    -&amp;gt; 時間軸（年）,value
    -&amp;gt; FROM popu_jp
    -&amp;gt; WHERE 時間軸（年） = &#39;2019年&#39;
    -&amp;gt; AND 人口 = &#39;総人口&#39;
    -&amp;gt; AND 男女別 = &#39;男女計&#39;
    -&amp;gt; ORDER BY value DESC
    -&amp;gt; LIMIT 10,30;
+-----------+-----------+--------------------+--------------------+-------+
| 男女別    | 人口      | 全国都道府県       | 時間軸（年）       | value |
+-----------+-----------+--------------------+--------------------+-------+
| 男女計    | 総人口    | 静岡県             | 2019年             |  3644 |
| 男女計    | 総人口    | 茨城県             | 2019年             |  2860 |
| 男女計    | 総人口    | 広島県             | 2019年             |  2804 |
| 男女計    | 総人口    | 京都府             | 2019年             |  2583 |
| 男女計    | 総人口    | 宮城県             | 2019年             |  2306 |
| 男女計    | 総人口    | 新潟県             | 2019年             |  2223 |
| 男女計    | 総人口    | 長野県             | 2019年             |  2049 |
| 男女計    | 総人口    | 岐阜県             | 2019年             |  1987 |
| 男女計    | 総人口    | 群馬県             | 2019年             |  1942 |
| 男女計    | 総人口    | 栃木県             | 2019年             |  1934 |
| 男女計    | 総人口    | 岡山県             | 2019年             |  1890 |
| 男女計    | 総人口    | 福島県             | 2019年             |  1846 |
| 男女計    | 総人口    | 三重県             | 2019年             |  1781 |
| 男女計    | 総人口    | 熊本県             | 2019年             |  1748 |
| 男女計    | 総人口    | 鹿児島県           | 2019年             |  1602 |
| 男女計    | 総人口    | 沖縄県             | 2019年             |  1453 |
| 男女計    | 総人口    | 滋賀県             | 2019年             |  1414 |
| 男女計    | 総人口    | 山口県             | 2019年             |  1358 |
| 男女計    | 総人口    | 愛媛県             | 2019年             |  1339 |
| 男女計    | 総人口    | 奈良県             | 2019年             |  1330 |
| 男女計    | 総人口    | 長崎県             | 2019年             |  1327 |
| 男女計    | 総人口    | 青森県             | 2019年             |  1246 |
| 男女計    | 総人口    | 岩手県             | 2019年             |  1227 |
| 男女計    | 総人口    | 石川県             | 2019年             |  1138 |
| 男女計    | 総人口    | 大分県             | 2019年             |  1135 |
| 男女計    | 総人口    | 山形県             | 2019年             |  1078 |
| 男女計    | 総人口    | 宮崎県             | 2019年             |  1073 |
| 男女計    | 総人口    | 富山県             | 2019年             |  1044 |
| 男女計    | 総人口    | 秋田県             | 2019年             |   966 |
| 男女計    | 総人口    | 香川県             | 2019年             |   956 |
+-----------+-----------+--------------------+--------------------+-------+
30 rows in set (0.001 sec)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;今回はここまで。&lt;/p&gt;
&lt;div class=&quot;fieldset&quot;&gt;
&lt;h3 class=&quot;legend&quot; style=&quot;width: 65px;&quot;&gt;まとめ&lt;/h3&gt;
&lt;dl&gt;
&lt;dt&gt;SELECT構文の基本&lt;/dt&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名;&lt;/dd&gt;
&lt;dd&gt;SELECT 列名1,列名2,... FROM テーブル名1,テーブル名2,...;&lt;/dd&gt;
&lt;dd&gt;例えば列名にワイルドカードとして*（アスタリスク）を用いると、全ての列が選択される。この用法はもっとも多く用いられている。&lt;/dd&gt;
&lt;dd&gt;SELECT * FROM テーブル名;&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;条件句を設ける&lt;/dt&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 列名 = 値;&lt;/dd&gt;
&lt;dd&gt;値が数値型以外の場合は&#39;（一重引用符）で挟む必要がある。&lt;/dd&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 列名 = &#39;値&#39;;&lt;/dd&gt;
&lt;dd&gt;!（感嘆符）によって等価演算子=を否定することができる。&lt;/dd&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 列名 != &#39;値&#39;;&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;「列名 = 複数の値」を指定したいとき&lt;/dt&gt;
&lt;dd&gt;等価演算子の代わりにIN()函数を使う。&lt;/dd&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 列名 IN(値1,値2,...);&lt;/dd&gt;
&lt;dd&gt;NOT IN()函数を用いると「それらを除く」という条件を指定できる。&lt;/dd&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 列名 NOT IN(値1,値2,...);&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;条件式に比較演算子を使うことができる&lt;/dt&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 列名 &amp;gt; 値;&lt;/dd&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 列名 &amp;lt; 値;&lt;/dd&gt;
&lt;dd&gt;&amp;gt;=は以上を意味し、&amp;lt;=は以下を意味する。&lt;/dd&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 列名 &amp;gt;= 値;&lt;/dd&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 列名 &amp;lt;= 値;&lt;/dd&gt;
&lt;/dl&gt;
&lt;dd&gt;値が数値型でない場合は&#39;値&#39;のように一重引用符を使って挟む必要がある。&lt;/dd&gt;
&lt;dl&gt;
&lt;dt&gt;条件式は論理演算子を使って複数指定可能&lt;/dt&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 条件1 AND 条件2 AND ...;&lt;/dd&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 条件1 OR 条件2 OR ...;&lt;/dd&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 条件1 AND 条件2 OR ...;&lt;/dd&gt;
&lt;dd&gt;XOR演算子は排他的なOR演算子。ORの集合からANDの集合を差し引いた残りがXORの集合になる。XOR = OR - AND。&lt;/dd&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE 条件1 XOR 条件2;&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;ある値から別の値までを条件式にする&lt;/dt&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 WHERE BETWEEN 値1 AND 値2;&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;特定の列に基づく行（レコード）の並べ替え（昇順）&lt;/dt&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 ORDER BY 列名;&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;特定の列に基づく行（レコード）の並べ替え（降順）&lt;/dt&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 ORDER BY 列名 DESC;&lt;/dd&gt;
&lt;/dl&gt;
&lt;dl&gt;
&lt;dt&gt;出力行数を制限する&lt;/dt&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 LIMIT 最大行数;&lt;/dd&gt;
&lt;dd&gt;カンマで区切って2つ数値を並べると「何行目から何行目まで」という意味になる。&lt;/dd&gt;
&lt;dd&gt;SELECT 列名 FROM テーブル名 LIMIT 行目1, 行目2;&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;h4&gt;関連記事&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2021/01/mariadbdebian-gnulinux-10.html&quot;&gt;MariaDBをDebian GNU/Linux 10にインストールして使うまでの準備&lt;/a&gt;&lt;/dt&gt;
&lt;dt&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2021/01/mariadbmysqlmysql.html&quot;&gt;MariaDBかMySQLでmysqlシェルを用いてテーブル作成&lt;/a&gt;&lt;/dt&gt;
&lt;dt&gt;&lt;a href=&quot;https://komputilo.blogspot.com/2021/02/e-statmariadb_5.html&quot;&gt;e-Statの統計データをデータベース（MariaDB）に取り込む&lt;/a&gt;&lt;/dt&gt;
&lt;/dl&gt;</content><link rel='replies' type='application/atom+xml' href='http://komputilo.blogspot.com/feeds/6714954191656232974/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://komputilo.blogspot.com/2021/02/mariadbmysqlselect-1.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/6714954191656232974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4092105836392232093/posts/default/6714954191656232974'/><link rel='alternate' type='text/html' href='http://komputilo.blogspot.com/2021/02/mariadbmysqlselect-1.html' title='MariaDBかMySQLでSELECTステートメント色々 - その1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>