Chapter 3
リストと数列Mathematica の特徴のひとつは「リスト」というベクトルのようなデータ形式をもっていることである．ベクトルも行列も数列も集合も，すべてリストにできる．
「リストを制すものは Mathematica を制す」と言っても過言ではない．

数学ではしばしば数列の収束・発散が問題となる．とくに収束数列の場合，数値計算への応用という観点からその「収束速度」が重要な意味をもつ．たとえば，次のような問題を考えよう：
収束速度の比較問題．自然対数の底 e への収束列として，()n1
an = 1 +nbn = 1 +11
1++ ··· +1!
2!
n!のふたつがよく知られているが，理論的には bn のほうが収束が速いとされている．
それを数値的に確かめよ．
実際，誤差 |an − e| は 3/n 以下，|bn − e| は 2/n! 以下であることが理論的にわかるので，bn のほうがはるかに収束が速いのである．これを数値的に実感するには，anと bn を Mathematica に 10 項目ぐらいまで計算させてみて，結果を並べてみるのがよい（問題 3.7）．こうした操作に必要な知識を学ぶのがこの章の目標である．

3.1

リストとは？

リストとはベクトル，行列，テンソル，数列，集合などなど，さまざまなものを表現できる Mathematica 独自のデータ構造（データのいれもの）であり，中括弧 { } を26

3

リストと数列用いて{a, b, c}{{a, b}, {c, d}}{Sin[x], Cos[x], Tan[x]}のように表される．リストはベクトルによく似ているが，ベクトルよりもっと多くの演算が大胆に適用できる．具体例をみていこう．
[1]

リスト v1 と v2 を定義：

In[1]:=

v1 = {a, b, c};v2 = {p, q, r};

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

v1 と v2 のベクトル的な和：

ベクトル的な定数倍：

各要素に 1 を足す:

文字 x から各要素を引く:

各要素を 3 乗：

5 を「リスト乗」：

指数関数を各要素に作用：リストの「リスト乗」：[10] 要素ごとの積：[11] 要素ごとの商：In[2]:=

v1 + v2

Out[2]=

8a + p, b + q, c + r<

In[3]:=

100*v1

Out[3]=

8100 a, 100 b, 100 c<

In[4]:=

v1 + 1

Out[4]=

81 + a, 1 + b, 1 + c<

In[5]:=

x - v1Out[5]=

8- a + x, - b + x, - c + x<

In[6]:=v1^3

Out[6]=

9a3 , b3 , c3 =In[7]:=

5^v1

Out[7]=

95a , 5b , 5c =In[8]:=

Exp[v1]

Out[8]=

9ãa , ãb , ãc =In[9]:=v1^v2

Out[9]=

8ap , bq , cr <In[10]:=v1*v2

Out[10]=8a p, b q, c r<

In[11]:=v1/v2

Out[11]=a b c: , , >p q r

リストの生成3.2[12] ベクトルとしての内積：27

In[12]:=v1.v2

Out[12]=

ap+bq+cr

問題 3.1 u = {1, 2, 3, 4, 5} と定義する．文字 x と上で紹介したリストの演算をうまく組み合わせて，{ 3}
1 − 1, 23 − 2, 33 − 3, 43 − 4, 53 − 5 ,{x2 x3 x4 x5x,,,,2!
3!
4!
5!

}に等しいリストをそれぞれ作成せよ．ただし，n の階乗は n!もしくは Factorial[n]で計算できる．
【解答】 ほとんどパズルのような問題である．まずu = {1, 2, 3, 4, 5};
˘¯と定義する．たとえば 13 − 1, 23 − 2, 33 − 3, 43 − 4, 53 − 5 の場合,
In[ ]:=

In[ ]:=

u^3 - u80, 6, 24, 60, 120<¯
次に x, x2 /2, x3 /3!, x4 /4!, x5 /5! の場合，階乗のリストがOut[ ]=˘

In[ ]:=
Out[ ]=u!
81, 2, 6, 24, 120<と得られることを確かめた上で，In[ ]:=

Out[ ]=

3.2x^u/u!
x2 x3 x4x5:x,,,,>2624 120¨

リストの生成リストを効率的に作る組込み関数を紹介しておこう．まず（有限項からなる）等差数列を作るには，Range が良い．
[13] Range を用いて，リスト {1, 2, 3, 4, 5} を作る：
In[13]:=

Out[13]=Range[5]81, 2, 3, 4, 5<[14] Range を用いて，リスト {4, 5, . . . , 10} を作る：
In[14]:=

Out[14]=

Range[4, 10]84, 5, 6, 7, 8, 9, 10<28

3

リストと数列[15] Range を用いて，4 ≤ x ≤ 10 で 0.7 刻みのリストを作る：
In[15]:=

Out[15]=

Range[4, 10, 0.7]
84., 4.7, 5.4, 6.1, 6.8, 7.5, 8.2, 8.9, 9.6<

これは「初項 4，公差 0.7 の等差数列の 10 以下の部分からなるリスト」である．
一般項を与えてリストを生成するには，関数 Table を用いる．
[16] Table を用いて，平方数 (square numbers) からなるリスト sq を作る：
In[16]:=

Out[16]=

sq = Table[n^2, {n, 1, 10}]81, 4, 9, 16, 25, 36, 49, 64, 81, 100<

Table[..] の中身は「n を 1 から 10 まで（1 刻みで）動かして n^2 のリストを作れ」という意味である．Table はたいへん使い勝手が良いので，以後も頻繁に登場することになるだろう．
[17] うしろに二重括弧 [[In[17]:=

Out[17]=]] をつけてリスト sq の 7 番目の要素を取り出す：

sq[[7]]
49[18] Length でリスト sq の長さ（要素の数）を求める．意外とよく使う関数である：
In[18]:=

Out[18]=Length[sq]10問題( 3.2)(e への収束列) Table を 用 い て ，自 然 対 数 の 底 e へ の 収 束 列 an =11+nnの第 10 項目まで近似値（N 関数を施した値）からなるリスト an を作れ．
【解答】 [16] と同様に Table を用いる：
In[ ]:=

Out[ ]=

an = Table[N[(1 + 1/n)^n], {n, 1, 10}]

82., 2.25, 2.37037, 2.44141, 2.48832,2.52163, 2.5465, 2.56578, 2.58117, 2.59374<¨

問題 3.3 (まとめて因数分解) Table を用いて，x − 1, x2 − 1, · · · , x10 − 1 からなるリストと，その各要素を因数分解した結果からなるリストを作れ．
【解答】 [16] と同様に Table 関数を用いて xn − 1 のリストを作る：

「リストのリスト」の行列形式・表形式

3.3

In[ ]:=

Out[ ]=

29

list = Table[x^n - 1, {n, 1, 10}]
9-1 + x, -1 + x2 , -1 + x3 , -1 + x4 , -1 + x5 ,-1 + x6 , -1 + x7 , -1 + x8 , -1 + x9 , -1 + x10 =次に Factor を list の各要素に適用する*1 ：In[ ]:=

Out[ ]=

Factor[list]
9-1 + x, H-1 + xL H1 + xL, H-1 + xL I1 + x + x2 M,
H-1 + xL H1 + xL I1 + x2 M, H-1 + xL I1 + x + x2 + x3 + x4 M,
H-1 + xL H1 + xL I1 - x + x2 M I1 + x + x2 M,
H-1 + xL I1 + x + x2 + x3 + x4 + x5 + x6 M,
H-1 + xL H1 + xL I1 + x2 M I1 + x4 M, H-1 + xL I1 + x + x2 M I1 + x3 + x6 M,
H-1 + xL H1 + xL I1 - x + x2 - x3 + x4 M I1 + x + x2 + x3 + x4 M=¨

問題 3.4 (要素の取り出し・並べ替え) mat = {m,a,t,h,e,m,a,t,i,c,a} と 定 義する．このリストの文字（要素）の順序を逆にしたリスト tam を Table 関数を用いて作れ．(Hint：tam の n 項目は mat の何項目？)【解答】 じつは組込み関数 Reverse を用いて tam = Reverse[mat] とすれば一発なのだが，ここはあくまで練習ということで Table を用いてやってみよう．
リスト mat を定義し，その長さを len とおく*2 ：In[ ]:=

mat = {m,a,t,h,e,m,a,t,i,c,a};len = Length[mat];tam の n 番目の要素は mat の len - (n - 1) 番目の要素だから，In[ ]:=

Out[ ]=3.3

tam = Table[mat[[len - n + 1]], {n, 1, len}]
8a, c, i, t, a, m, e, h, t, a, m<¨「リストのリスト」の行列形式・表形式

問題 3.3 の結果を見ると，長いリストが複数行にわたって出力されていて，あまり見やすいとはいえない．ここではリストを一覧表の形で並べたり，行列を「リストのリスト」として表現する方法を紹介しよう．

*1 Factor も [8] の Exp のように，リストの要素それぞれに関数の作用を「分配」することができる．
*2 もちろん数え上げれば len が 11 だとわかるが，今後の応用を考えてあえて「Mathematica にも意味がわかるように」定義したのである．

30

3

リストと数列[19] 「リストのリスト」 m1 を定義*3 ：In[19]:=

m1 = {{a, b, c}, {p, q, r}};[20] MatrixForm を用いて m1 を行列 (matrix) として表示：

m1 //MatrixForm
a b cOut[20]//MatrixForm=OKp q rIn[20]:=*4 *5 [19] で定義したリスト m1 の中身
この入力式は MatrixForm[m1] と書いてもよい．と，行と列の対応に注意しよう．
[21] TableForm を用いて m1 を表 (table) として表示：
In[21]:=

m1 //TableForm

Out[21]//TableForm=

apbqcr

これも TableForm[m1] と書いてよい．
[22] Table で行列（リストのリスト）を生成することもできる：
In[22]:=

Out[22]=m2 = Table[i + j, {i, 1, 4}, {j, 1, 5}]882, 3, 4, 5, 6<, 83, 4, 5, 6, 7<,
84, 5, 6, 7, 8<, 85, 6, 7, 8, 9<<[23] TableForm で見てみよう：
In[23]:=

m2 //TableForm

Out[23]//TableForm=

23453456456756786789m2 の定義式（ [22] ）と比べると，{i, 1, 4} が行の方向，{j, 1, 5} が列の方向に対応することがわかる．
[24] 二重括弧 [[In[24]:=]] で 2 行 5 列目に対応する要素を取り出す：

m2[[2, 5]]*3 [1] で定義した v1= {a, b, c} と v2 = {p, q, r} を用いて，m1 = {v1, v2} としてもよい．

*4 逆の発想で，Sin[x] を x//Sin と書いてもよいのである．しかし本書では混乱をさけるために

TableForm と MatrixForm 以外でこの記法は用いない．
*5 MatrixForm はリストをいわば「文字を行列風に配置した画像のようなもの」に置き換える関数である．たとえば 2*m1 は行列（リスト）として各要素を 2 倍したものになるが，2*MatrixForm[m1]はもはや行列ではなく，これ以上の計算ができない．次の TableForm も同様である．

3.3「リストのリスト」の行列形式・表形式

Out[24]=317

問題 3.5 (九九の表) リストの TableForm を用いて，1 から 9 までの積の表（九九の表）を作れ．また，1 から 19 までの奇数同士の積を表にせよ．
【解答】 まずは Table を用いて，In[ ]:=

kuku = Table[m * n, {m, 1, 9}, {n, 1, 9}];kuku //TableForm

Out[ ]//TableForm=

123456789246810121416183691215182124274812162024283236510152025303540
45

612182430
3642
48
54

71421
28
35424956
63

81624
3240
4856
64
72

918273645
5463
7281を得る．同様に，
In[ ]:=

kisuu = Table[(2 m - 1)*(2 n - 1), {m, 1, 10}, {n, 1, 10}];kisuu //TableForm

Out[ ]//TableForm=

1
357911131517193
915
212733394551575152535
45
55
65
75
85
95

72135
4963
77
91
105
119
133

92745638199
117
135153
171

1133557799
121
143
165
187
209

13396591
117
143
169
195
221
247154575105135165
195
225255285

175185119153
187
221255289
323

195795133
171209247285323361¨

問題 3.6 (一覧表の作成) 1 から 10 までの自然数とその 2 乗，3 乗の一覧表を作成
せよ．
【解答】 「{n, n^2, n^3} の形のリスト」を並べたリスト power を作成し，TableForm で表現する：
In[ ]:=

power = Table[{n, n^2, n^3}, {n, 1, 10}];power //TableForm

323

1234
5678910Out[ ]//TableForm=3.41491625364964
81100

1827641252163435127291000

リストと数列¨

数列の和数列の和を Mathematica に計算させたいときは，組込み関数 Sum を用いるとよい．
[25] Sum で 1 から 10 までの 2 乗の和10∑n2 を求める：

n=1
In[25]:=

Out[25]=Sum[n^2, {n, 1, 10}]385

入力式はちょうど，[16] で定義したリスト sq = Table[n^2, {n, 1, 10}] の Tableを Sum に変えた形になっている．
[26] Mathematica は 2 乗の和の一般項も知っている：
In[26]:=

Sum[k^2, {k, 1, n}]1Out[26]=6n H1 + nL H1 + 2 nL[27] オイラーの無限級数 1 + 1/22 + 1/32 + · · ·In[27]:=の値も知っている：

Sum[1/n^2, {n, 1, Infinity}]Π2

Out[27]=6

入力式の Infinity は無限大 ∞ を表す組込み定数である．
[28] 8 次の多項式を作る*6 ：In[28]:=

Out[28]=Sum[x^n/n!, {n, 0, 8}]
1+x+x2 x3 x4x5x6x7x8++++++26
24 120 720 5040 40 320*6 ちなみに無限級数 Sum[x^n/n!,なる．たいしたものである．

{n, 0, Infinity}] を計算するとちゃんと指数関数 Exp[x] に

3.4

数列の和

33

[29] Product で 1 から 19 までの奇数の積10∏(2n − 1) を求める：

n=1
In[29]:=

Out[29]=Product[2*n - 1, {n, 1, 10}]654 729 075[30] 問題 3.5 で求めた「九九の表」にある数を全部足し上げる：
In[30]:=

Out[30]=Sum[m * n, {m, 1, 9}, {n, 1, 9}]2025

では，冒頭の収束速度の比較問題に解答を与えよう：
問題 3.7 (収束速度の比較) 自然対数の底 e への典型的な収束列()n1an = 1 +nbn = 1 +1
1
1++ ··· +1!
2!
n!

を考える．これらの収束速度を比較しよう．

(1) Sum を用いて b5 の近似値を求めよ．
(2) さらに Table を組み合わせて，bn の第 10 項目までの近似値からなるリスト
bn を作成せよ．
(3) 上の bn と問題 3.2 で作成した an を用いて，an , |an − e|, bn , |bn − e| を比較する一覧表を作成せよ．ただし，実数もしくは複素数 x の絶対値は組込み関数 Abs[x] で与えられる．
【解答】 (1) 近似値であるから N を忘れずに：In[ ]:=Out[ ]=N[Sum[1/k!, {k, 0, 5}]]2.71667(2) Table の中に N，Sum を入れ子状に用いる：
In[ ]:=

bn = Table[ N[Sum[1/k!, {k, 0, n}]], {n, 1, 10}]

Out[ ]=

82., 2.5, 2.66667, 2.70833, 2.71667,2.71806, 2.71825, 2.71828, 2.71828, 2.71828<(3) 少し工夫が必要である．たとえばリスト an を使うと，a5 と |a5 − e| はそれぞれ an[[5]]と Abs[an[[5]]-E] で表されることに注意しよう：
In[ ]:=

hikaku = Table[343

リストと数列{an[[n]], Abs[an[[n]]-E], bn[[n]], Abs[bn[[n]]-E]},{n, 1, 10}];hikaku //TableForm
Out[ ]//TableForm=2.
2.25
2.370372.441412.48832
2.521632.54652.56578

0.718282
0.468282
0.347911
0.276876
0.229962
0.196655
0.171782
0.152497

2.
2.5
2.666672.70833
2.716672.71806
2.71825
2.718280.718282
0.218282
0.0516152
0.0099485
0.00161516
0.000226273
0.0000278602
3.05862 ´ 10-6

2.581170.1371072.71828

3.02886 ´ 10-7

2.59374

0.124539

2.71828

2.73127 ´ 10-8見てのとおり，bn のほうが圧倒的な速さで収束することがわかる．e の近似値が必要になった
とき，実用上は bn を使うほうが効率がよい，ということである．

¨

最後に，数列の和に関連する大学入試問題を Sum を使って解いてみよう：
問題 3.8 (大学入試問題から) Mathematica を用いて計算せよ．

(1) 次の和を数値的に（近似値で）求めよ：

100∑
k=2(2) 数列

√k+3
√k−1

（99 兵庫大）.

222,,, . . . の第 n 項のまでの和を求めよ．
22 − 1 32 − 1 42 − 1（00 日本福祉大）(3) 連続する m 個の奇数 1, 3, 5, . . . , 2m − 1 の中から，異なる 2 つの数をとって積を作る．こうして得られる m C2 通りの積すべての和を求めよ．
（99 浜松医大）【解答】 (1) 普通われわれは √1√√k−√k − 1 のような変形を期待するが，与k+ k−1
えられた式のとおり Mathematica に Sum[3/(Sqrt[k] + Sqrt[k - 1]), {k, 2, 100}] と=入力しても，ただ長い式が書き並べられるだけである．しかし問題では「数値的に」といっているから，上の入力式にさらに N 関数を施すか，もしくははじめから各項に N 関数を施して次のように計算させる*7 ：In[ ]:=
Out[ ]=

Sum[N[3/(Sqrt[k] + Sqrt[k - 1])], {k, 2, 100}]27.

(2) 少し時間はかかるがそのまま入力すれば一般項を求めてくれる（一般項と i の範囲に注*7Sum[3.0/(Sqrt[k] + Sqrt[k - 1]), {k, 2, 100}]; としても同じ結果が得られる．分子の3 を 3.0 に変えることで，数値計算だと認識されるからである．

研究3.535意．
）：
In[ ]:=

Sum[2/(i^2 - 1), {i, 2, n + 1}]
5 n + 3 n2Out[ ]=

2 H1 + nL H2 + nL(3) これは若干難しいかもしれないが，次の恒等式(x1 + · · · + xm )2= (x21 + · · · + x2m ) + 2m
Xxi xj1≤i<j≤mにおいて xi = 2i − 1 (1 ≤ i ≤ m) とおけばよい（求めたいのは下線部）．あとは Mathematicaにやらせよう：
In[ ]:=

a = Sum[2 i - 1, {i, 1, m}];b = Sum[(2 i - 1)^2, {i, 1, m}];c = (a^2 - b)/2
1

Out[ ]=

2In[ ]:=Out[ ]=3.5

1m4 +3Im - 4 m 3 M

Factor[c]1H- 1 + mL m I- 1 - m + 3 m 2 M
6¨

研究以下を Mathematica を用いて実行してみよ．

(1) i が 1 から m まで，j が 1 から n までの値をすべて動くとき，i + j の総和を求∑めよ．すなわち， 1≤i≤m,1≤j≤n (i + j) を計算せよ．
(2) i, j, k が 1 から n までの値をすべて動くとき，i + j + k の総和を求めよ．
∑すなわち， 1≤i,j,k≤n (i + j + k) を計算せよ．
(3) 初項 4，公比 8 の等比数列の第 n 項までの和を Sn で表す．このとき，S99 はカキ けたの整数，S100 は クケ けたの整数である．さらに，S1 から S100 の間で， クケ 以下のすべてのけた数の Sn が存在するか確認せよ．
（92 センター本試・改）(Hint: Sn の桁数は 1 + log10 Sn の整数部分で与えられる．その一覧表を作れ．
正の実数 x の整数部分は Floor[x] で与えられる．)(4) ドキュメントセンターを開き，リストに関連してどのような組込み関数があるか調べよ．